Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系
devise、cancan和rolify這三個組件結合,可以建立完整而強大的用戶權限模型。
- devise介紹,負責用戶注冊、登錄、退出、找回密碼等操作。細節參考devise on github
- cancan介紹, 負責角色建立、對角色授權、在頁面中根據授權是否顯示元素,以及模型中超出授權時拋出異常。細節參考rolify on github
- rolify介紹,負責將用戶與角色關聯。細節參考rolify on github
下面就簡單介紹下這三者結合使用的方法,比較淺,深層次的大家自己去看文檔挖掘,這里僅僅介紹最基本的使用。
運行環境
這里我用的是ruby 1.9.3-p484 ? ? ? rails ? 3.2.16
新建一個項目
rails new demo --skip-bundle ? #跳過bundle
在Gemfile里面添加如下Gem包
?| 1 2 3 4 | # add a perfect user verify system gem 'devise' gem 'cancan' gem 'rolify' |
然后運行bundle install
?執行devise初始化
$ rails generate devise:install這句命令會產生一個用戶指南,告訴你該做的幾件事請,以下是內容翻譯(已經去除heroku部署的那一條,增加了登錄退出選項的說明):
1) 確定你的環境中有一個缺省的URL,config/environments/development.rb:
config.action_mailer.default_url_options = { :host => 'localhost:3000' }如果在production環境, :host 必須設置成應用的真實主機名。
2) 確定已經在config/routes.rb中定義了root_url(注意刪除public下面的index.html), 例如:
root :to => "home#index"可以使用下面命令生成一個home#index的頁面:
rails g controller home index3) 在app/views/layouts/application.html.erb中增加消息提醒,例如:
| <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> |
4) 很多時候還需要增加登錄、退出的選項:
?| 1 2 3 4 5 6 7 | ????<% 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 %><span></span> |
5) 如果要定制Devise的view模型,可以再執行以下語句:
$ rails g devise:views生成用戶模型(你可以使用其他名稱代替User),并執行數據遷移
$ rails g devise User $ rake db:migrate?在Controller中增加認證過濾,即可在訪問該模型頁面時轉向用戶登錄頁面(這自行沒驗證)
在需要認證的模型中,如HomeController,增加下面代碼:
before_filter :authenticate_user!集成cancan和rolify
cancan提供對資源的授權控制。例如,在視圖中使用can?方法來決定是否顯示某個頁面元素。如果系統角色非常簡單,那么cancan還在代碼中直接指定常量就可以支持,具體操作可以參考官方文檔。但要提供復雜的角色管理,最好的方案,還是在devise基礎上再集成cancan+rolify。
1. 修改Gemfile,并再次運行bundle install
gem 'cancan' gem 'rolify'2. 創建cancan的Ability和rolify的Role
$ rails generate cancan:ability $ rails generate rolify Role User $ rake db:migrate3. 定制devise用戶注冊事件,可以在注冊時賦予用戶rolify角色,例如,下面的代碼為首個用戶賦予admin角色:
?| 1 2 3 4 5 6 7 8 9 10 11 | 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 |
4. 使用cancan可以為rolify中建立的角色分配授權資源,例如我們為允許admin角色的用戶分配針對所有控制類的”manage”資源,而其他用戶分配”read”資源:
?| 1 2 3 4 5 6 7 8 9 10 | class Ability ?????include CanCan::Ability ?????def initialize(user) ???????if user.has_role? :admin ?????????can :manage, :all ???????else ?????????can :read, :all ???????end ?????end ???end |
5. 以上已經實現了“用戶-角色-權限”的三層權限模型,在view中就可以使用了。例如,在Home#index頁面中增加如下代碼:
?| 1 2 3 4 5 6 | <% if user_signed_in? %> ????????<p>The user is loged in.</p> ????????<% if can? :manage, :Home %> ??????????<%= link_to "About", home_about_path?? %> ????????<% end %> ????<% end %> |
(完)
總結
以上是生活随笔為你收集整理的Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C链表的简单案例
- 下一篇: 类似Tinder APP的配对逻辑