CanCan is an authorization library for Ruby on Rails that defines the authorization of specific resources for multiple users. These permissions are all set in a single locality (the Ability
class) and are not duplicated across controllers, views, or database queries.
There are a few ways to install CanCan depending on your version of Rails.
Gem
file and run the bundle command:gem "cancan"
config.gem "cancan"
It can also be installed as a plugin by running the command:
rails plugin install git://github.com/ryanb/cancan.git
CanCan expects a current_user
method to exist in the controller.
User permissions are defined in the Abilities
class.
For Rails 3, use the following generator:
rails g cancan:ability
For Rails 2.3, add a new class to apps/models/ability.rb and append the following code:
class Ability
include CanCan::Ability
def initialize(user)
end
end
Further details on defining abilities can be found here.
Once initialized, the permissions for the current user can be checked using can?
and cannot?
methods in the view and controller.
<% if can? :update, @article %>
<%= link_to “Edit”, edit_article_path(@article) %>
<% end %>
More information on Checking Abilities can be found here.
Perform the following action:
def show
@article = Article.find(params[:id])
authorize! :read, @article
end
The authorize!
method will raise an exception if the user is not able to perform the above task.
To enable the above action for every action, use load_and_authorize_resource
method. This will automatically enable all actions.
class ArticlesController < ApplicationController<br>
load_and_authorize_resource
def show
# if we have a show on Articles controller, it automatically calls it
end
end
If the user is unauthorized, an exception is raised. To alert the user of the exception, use:
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, :alert => exception.message
end
end
Further details on error handling can be found here.
To ensure authorization happens on every action, use the check_authorization
controller. The skip_uthorization_check
can be used to skip the methods where authorization is not performed on an action.
class ApplicationController < ActionController::Base
check_authorization
end
Further details can be found here.
Free Resources