原文中有些問題,我按本身的實踐稍稍作了些修改。不知到是否是Gem升級到最新的緣故,不過仍是解決了。 html
devise、cancan和rolify這三個組件結合,能夠創建完整而強大的用戶權限模型。 git
下面就簡單介紹下這三者結合使用的方法,比較淺,深層次的你們本身去看文檔挖掘,這裏僅僅介紹最基本的使用。 github
這裏我用的是ruby 1.9.3-p484 rails 3.2.16 ruby
rails new demo --skip-bundle #跳過bundle session
在Gemfile裏面添加以下Gem包 app
# add a perfect user verify system gem 'devise' gem 'cancan' gem 'rolify'
而後運行bundle install url
$ rails generate devise:install
這句命令會產生一個用戶指南,告訴你該作的幾件事請,如下是內容翻譯(已經去除heroku部署的那一條,增長了登陸退出選項的說明): spa
1) 肯定你的環境中有一個缺省的URL,config/environments/development.rb: 翻譯
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
若是在production環境, :host 必須設置成應用的真實主機名。 code
2) 肯定已經在config/routes.rb中定義了root_url(注意刪除public下面的index.html), 例如:
root :to => "home#index"
可使用下面命令生成一個home#index的頁面:
rails g controller home index
3) 在app/views/layouts/application.html.erb中增長消息提醒,例如:
<p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> |
4) 不少時候還須要增長登陸、退出的選項:
<% if current_user %> <%= link_to('退出', destroy_user_session_path, :method => :delete) %> | <%= link_to('修改密碼', edit_registration_path(:user)) %> <% else %> <%= link_to('註冊', new_registration_path(:user)) %> | <%= link_to('登陸', new_session_path(:user)) %> <% end %>
5) 若是要定製Devise的view模型,能夠再執行如下語句:
$ rails g devise:views
$ rails g devise User $ rake db:migrate
在須要認證的模型中,如HomeController,增長下面代碼:
before_filter :authenticate_user!
cancan提供對資源的受權控制。例如,在視圖中使用can?方法來決定是否顯示某個頁面元素。若是系統角色很是簡單,那麼cancan還在代碼中直接指定常量就能夠支持,具體操做能夠參考官方文檔。但要提供複雜的角色管理,最好的方案,仍是在devise基礎上再集成cancan+rolify。
gem 'cancan' gem 'rolify'
$ rails generate cancan:ability $ rails generate rolify Role User $ rake db:migrate
class ApplicationController < ActionController::Base def after_sign_in_path_for(resource) if resource.is_a?(User) if User.count == 1 resource.add_role 'admin' end resource end root_path end end
class Ability include CanCan::Ability def initialize(user) if user.has_role? :admin can :manage, :all else can :read, :all end end end
<% if user_signed_in? %> <p>The user is loged in.</p> <% if can? :manage, :Home %> <%= link_to "About", home_about_path %> <% end %> <% end %>(完)