Ruby on Rails: 使用devise+cancan+rolify建立完整的許可權管理系

來源:互聯網
上載者:User

標籤:

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包

?
1234 # add a perfect user verify systemgem ‘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 index

3) 在app/views/layouts/application.html.erb中增加訊息提醒,例如:

<p class="notice"><%= notice %></p>  <p class="alert"><%= alert %></p> 

4) 很多時候還需要增加登入、退出的選項:

?
1234567     <% 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:migrate
3. 定製devise使用者註冊事件,可以在註冊時賦予使用者rolify角色,例如,下面的代碼為首個使用者賦予admin角色:?
1234567891011 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”資源:?
12345678910 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頁面中增加如下代碼:?
123456 <% 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建立完整的許可權管理系

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.