rails權限管理—devise+cancan+rolify


使用devise、cancan和rolify組件建立用戶權限模型的說明。

  • devise:負責用戶注冊、登錄、退出、找回密碼等操作。細節參考devise on github
  • cancan:負責角色建立、對角色授權、在頁面中根據授權是否顯示元素,以及模型中超出授權時拋出異常。細節參考rolify on github
  • rolify:負責將用戶與角色關聯。細節參考rolify on github

其中,如果系統擁有自己獨立的用戶管理模塊,可以不使用devise控件。這里先介紹僅包含cancan+rolify的部分。

一、環境安裝配置

1.安裝gem包,Gemfile。

gem 'cancan'
gem 'rolify'

2. 創建cancan的Ability

$ rails generate cancan:ability
#該命令在model中建立ability.rb文件

3.和rolify的Role

$ rails generate rolify Role User
$ rake db:migrate

#如下圖所示
#在config中創建rolify的配置文件
#建立數據遷移文件,添加role,user_role模型,並創建數據表
#向user模型中添加rolify方法

 

至此,環境配置基本完成

 

二、權限管理

1.角色權限配置文件,集中管理權限信息

所有權限信息在app/models/ability.rb文件中存儲,范例,如下:

class Ability
  include CanCan::Ability

  def initialize(user)

    if user.blank?
      # not logged in
      cannot :manage, :all
      basic_read_only
    elsif user.has_role?(:admin)
      # admin
      can :manage, :all
    elsif user.has_role?(:member)
      
      can :create, Topic
      can :update, Topic do |topic|
        (topic.user_id == user.id)
      end
      
      can :destroy, Topic do |topic|
         (topic.user_id == user.id)
      end
      
      basic_read_only
    else
      # banned or unknown situation
      cannot :manage, :all
      basic_read_only
    end


  end
  
  protected

  def basic_read_only
    can :read,    Topic
    can :list,    Topic
    can :search,  Topic    
  end
end

2、權限判斷

view中的權限:

<% if can? :update, @article %>
  <%= link_to "Edit", edit_article_path(@article) %>
<% end %>

controller中的權限:

class ArticlesController < ApplicationController
  authorize_resource

  def show
    # @article is already authorized
  end
end

3、用戶角色添加

#在角色分配部分給用戶實力user對象添加角色
@user.add_role 'admin'

 

附:authorize_resource方法解析

authorize_resource 根據 CanCan::Ability 的權限表對 resource 進行權限判斷。

而 resource 必定是controller的同名實例。

也就是說 ArticlesController 對應的必然是 @article。

如果在 ArticlesController 里需要使用 @post,只需在 controller 里指定資源實例的名字,如,authorize_resource :post

 

三、devise的使用

1、安裝gem包

gem 'devise'

2、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) 很多時候還需要增加登錄、退出的選項:

<% 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
#新建數據遷移文件,向user表中添加必要的字段

在Controller中增加認證過濾,即可在訪問該模型頁面時轉向用戶登錄頁面(這自行沒驗證)

在需要認證的模型中,如HomeController,增加下面代碼:

before_filter :authenticate_user!

 

 

 

 

 

 

 

 

 

 

參考文檔: 

《Ruby on Rails: 使用devise+cancan+rolify建立完整的權限管理系統》

                       http://my.oschina.net/silentboy/blog/204772

《使用Devise+Rolify + Cancan 控管權限》

                      http://deveede.logdown.com/posts/206943-use-deviserolify-cancan-control-permissions

《Cancan 實作角色權限設計的最佳實踐(1、2、3) 》

                      ref:[http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-1/]

                      ref:[http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-2/]
                     ref:[http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-3/]

 

Rails插件:CanCan權限驗證插件學習總結

                     ref:[http://blog.csdn.net/jackal998099/article/details/21519925]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM