使用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]

rails权限管理—devise+cancan+rolify的更多相关文章

  1. ruby on rails 权限管理gem cancan

    系统的model关系如下: 用户类 class AdminUser embeds_many :permissions  accepts_nested_attributes_for :permissio ...

  2. Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系

    devise.cancan和rolify这三个组件结合,可以建立完整而强大的用户权限模型. devise介绍,负责用户注册.登录.退出.找回密码等操作.细节参考devise on github can ...

  3. Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理

    一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...

  4. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  5. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  6. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  7. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  8. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  9. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

随机推荐

  1. HBase-存储-KeyValue格式

    HBase-存储-KeyValue格式 本质上,HFile中的每个KeyValue都是一个低级的字节数组,它允许零复制访问数据. KeyValue格式如下 该结构以两个分别表示键长度(Key Leng ...

  2. 根据mysql中字段为时间戳查询某天数据

    //数据库保存的为时间戳select * from 表名 where FROM_UNIXTIME(存时间字段名,'%Y-%m-%d')='2017-12-12' //数据库保存的为日期格式时间SELE ...

  3. QT 利用ListWidget 和 StackedLayout 配合实现 分页 选项

    1. 如图, 左边为listwidget,右边为StackedLayout, 通过listwidget的不同选项,可以使右边的不同页显示出来. 2. dialog.h #ifndef DIALOG_H ...

  4. 命令行下载Baiduyun files

    源码 步骤1:先拿到一个插件插件地址1,插件地址2 步骤2:解压并保存 下载的文件中,包含了一个Baidu-PCS的文件夹.然后打开我们的资源管理器.将Baidu-PCS随意移动到一个文件目录下,但文 ...

  5. dede数据库表结构和dedecms数据库字段说明

    表名:dede_addonarticle (ENGINE=MyISAM/CHARSET=gbk) 说明:Top 字段名 说明描述 具体参数 aid 文章ID mediumint(8) unsigned ...

  6. PHP的mail()函数可以实现直接用脚本发送邮件

    PHP的mail()函数可以实现直接用脚本发送邮件. 用mail()函数发送邮件之前,首先需要在php.ini文件里面设置一下邮件服务属性,主要的设置选项如下: 属性 缺省值 说明 Changeabl ...

  7. 【codesmith】 初次试用(未发布)

      一直都有听过codesmith,一个很好用的软件,减少大量代码的输入,比如你生成一个list,并添加5个项. ArrayList list1=new ArrayList(); list1.Add( ...

  8. js中scrollIntoView()的用法

    一. 什么是scrollIntoView scrollIntoView是一个与页面(容器)滚动相关的API 二. 如何调用 element.scrollIntoView() 参数默认为true 参数为 ...

  9. MySQL管理

    http://www.yiibai.com/mysql/administration.html 在本节中,您将学习有关MySQL管理教程,包括MySQL服务器启动和关闭,MySQL服务器安全性,MyS ...

  10. UVA - 10934 Dropping water balloons (dp,逆向思维)

    题目链接 题目大意:给你n个规格一样的气球和一栋大楼的高度,求最少试验几次能测出气球最高在哪一层掉下来不破. 如果这道题想用(dp[i][j]=用i个气球测出j高度的楼需要几次)来作为状态的话,那你就 ...