zoukankan      html  css  js  c++  java
  • 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]

  • 相关阅读:
    为动态添加的元素,绑定click事件
    Struts报错NoSuchMethodException的解决方法
    Struts报错ObjectNotFoundException的解决方法
    HTML通知、新闻等文字列表的无缝滚动效果
    HTML通过使用JS动态显示table内容
    CentOS下整合Apache与Tomcat的一种方法
    Centos下Apache整合Tomcat访问报Forbidden 403 错误的解决方法
    从Google趋势来看五大联赛在世界范围内的影响力
    Java实现多线程的三种方法
    DataGrid中插入Combobox选择框
  • 原文地址:https://www.cnblogs.com/zs-note/p/4256226.html
Copyright © 2011-2022 走看看