cancan/README.rdoc

102 lines
4.4 KiB
Plaintext
Raw Normal View History

2009-11-17 01:03:54 +00:00
= CanCan
2011-01-08 21:25:45 +00:00
Wiki[https://github.com/ryanb/cancan/wiki] | RDocs[http://rdoc.info/projects/ryanb/cancan] | Screencast[http://railscasts.com/episodes/192-authorization-with-cancan]
2010-10-05 23:18:35 +00:00
CanCan is an authorization library for Ruby on Rails which restricts what resources a given user is allowed to access. All permissions are defined in a single location (the +Ability+ class) and not duplicated across controllers, views, and database queries.
2009-11-17 05:23:06 +00:00
== Installation
2010-10-05 23:18:35 +00:00
In <b>Rails 3</b>, add this to your Gemfile.
2010-10-05 23:18:35 +00:00
gem "cancan"
2010-10-05 23:18:35 +00:00
In <b>Rails 2</b>, add this to your environment.rb file.
2010-10-05 23:18:35 +00:00
config.gem "cancan"
2010-10-05 23:18:35 +00:00
Alternatively, you can install it as a plugin.
2009-11-17 06:15:10 +00:00
2010-10-05 23:18:35 +00:00
rails plugin install git://github.com/ryanb/cancan.git
2009-11-17 05:23:06 +00:00
== Getting Started
2009-11-17 05:23:06 +00:00
2011-01-08 21:25:45 +00:00
CanCan expects a +current_user+ method to exist in controllers. If you have not already, set up some authentication (such as Authlogic[https://github.com/binarylogic/authlogic] or Devise[https://github.com/plataformatec/devise]). See {Changing Defaults}[https://github.com/ryanb/cancan/wiki/changing-defaults] if you need different behavior.
2010-10-05 23:18:35 +00:00
Next create a class called +Ability+ in "models/ability.rb" or anywhere else in the load path. It should look similar to this.
2009-11-17 05:23:06 +00:00
class Ability
include CanCan::Ability
def initialize(user)
2009-11-17 05:23:06 +00:00
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
2011-01-08 21:25:45 +00:00
The +current_user+ is passed in to this method which is where the abilities are defined. See {Defining Abilities}[https://github.com/ryanb/cancan/wiki/defining-abilities] for what can go here.
2009-11-17 05:23:06 +00:00
The current user's permissions can then be accessed using the "can?" and "cannot?" methods in the view and controller.
2009-11-17 05:23:06 +00:00
<% if can? :update, @article %>
<%= link_to "Edit", edit_article_path(@article) %>
<% end %>
2011-01-08 21:25:45 +00:00
See {Checking Abilities}[https://github.com/ryanb/cancan/wiki/checking-abilities] for more information
2010-04-17 18:45:41 +00:00
The "authorize!" method in the controller will raise an exception if the user is not able to perform the given action.
2009-11-17 05:23:06 +00:00
def show
@article = Article.find(params[:id])
authorize! :read, @article
2009-11-17 05:23:06 +00:00
end
2010-04-17 19:37:32 +00:00
Setting this for every action can be tedious, therefore the +load_and_authorize_resource+ method is provided to automatically authorize all actions in a RESTful style resource controller. It will use a before filter to load the resource into an instance variable and authorize it for each action.
2009-11-17 05:23:06 +00:00
class ArticlesController < ApplicationController
load_and_authorize_resource
2009-11-17 05:23:06 +00:00
def show
2010-04-17 18:45:41 +00:00
# @article is already loaded and authorized
2009-11-17 05:23:06 +00:00
end
end
2011-01-08 21:25:45 +00:00
See {Authorizing Controller Actions}[https://github.com/ryanb/cancan/wiki/authorizing-controller-actions] for more information
2010-04-17 18:45:41 +00:00
2010-10-05 23:18:35 +00:00
If the user authorization fails, a <tt>CanCan::AccessDenied</tt> exception will be raised. You can catch this and modify its behavior in the +ApplicationController+.
2009-11-17 05:23:06 +00:00
class ApplicationController < ActionController::Base
2009-12-14 16:37:30 +00:00
rescue_from CanCan::AccessDenied do |exception|
2010-10-05 23:18:35 +00:00
flash[:alert] = exception.message
2009-11-17 05:23:06 +00:00
redirect_to root_url
end
end
2011-01-08 21:25:45 +00:00
See {Exception Handling}[https://github.com/ryanb/cancan/wiki/exception-handling] for more information.
2009-11-17 05:23:06 +00:00
2010-04-17 18:45:41 +00:00
== Additional Docs
2011-01-08 21:25:45 +00:00
* {Upgrading to 1.4}[https://github.com/ryanb/cancan/wiki/Upgrading-to-1.4]
* {Nested Resources}[https://github.com/ryanb/cancan/wiki/nested-resources]
* {Testing Abilities}[https://github.com/ryanb/cancan/wiki/testing-abilities]
* {Accessing Request Data}[https://github.com/ryanb/cancan/wiki/accessing-request-data]
* {Admin Namespace}[https://github.com/ryanb/cancan/wiki/admin-namespace]
* {See more}[https://github.com/ryanb/cancan/wiki]
== Questions or Problems?
2011-01-08 21:25:45 +00:00
If you have any issues with CanCan which you cannot find the solution to in the documentation, please add an {issue on GitHub}[https://github.com/ryanb/cancan/issues] or fork the project and send a pull request.
2011-01-09 05:48:19 +00:00
To get the specs running you should call +bundle+ and then +rake+. Specs currently do not work in Ruby 1.9 due to the RR mocking framework. See the {spec/README}[https://github.com/ryanb/cancan/blob/master/spec/README.rdoc] for more information.
2009-11-17 06:31:27 +00:00
== Special Thanks
2011-01-08 21:25:45 +00:00
CanCan was inspired by declarative_authorization[https://github.com/stffn/declarative_authorization/] and aegis[https://github.com/makandra/aegis]. Also many thanks to the CanCan contributors[https://github.com/ryanb/cancan/contributors]. See the CHANGELOG[https://github.com/ryanb/cancan/blob/master/CHANGELOG.rdoc] for the full list.