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 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) 很多时候还需要增加登录、退出的选项:
|
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:migrate
3. 定制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建立完整的权限管理系的更多相关文章
- rails权限管理—devise+cancan+rolify
使用devise.cancan和rolify组件建立用户权限模型的说明. devise:负责用户注册.登录.退出.找回密码等操作.细节参考devise on github cancan:负责角色建立. ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置
前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...
- 10个基于 Ruby on Rails 构建的顶级站点
本文系国内 ITOM 行业领军企业 OneAPM 工程师翻译整理自 Raviraj Hegde 的文章 Top Sites Built with Ruby on Rails. 就其本身而言,Ruby ...
- Ruby on Rails开发Web应用的基本概念
Web应用架构 C/S架构 Web应用从最初就採用C/S架构.Server负责监听client请求,提供资源,Client向server发起请求并渲染页面.两者通过TCP/IP协议栈之上的HTTP协议 ...
- Ruby on Rails 實戰聖經阅读(二)
1.操作系统 centos5.4 2.安装ruby yum install ruby 会安装得到 1.8.5 如果你公司用的是1.8.X就无所谓了, 拿这个学习就行了 如果你们公司用的是1.9.X,那 ...
- 开发环境准备:Ruby on Rails开发环境配置
开发环境准备:Ruby on Rails开发环境配置 前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完 ...
- 开发新手最容易犯的50个 Ruby on Rails 错误(1)
[编者按]本文最早发布与 JETRuby 博客,主要介绍了开发新手最容易犯的 Ruby 错误.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 一年前,我们创立了以 "Rubyboo ...
随机推荐
- C#中的虚方法和抽象方法(Thirteenth Day)
今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用. 理论: 虚方法: •用virtual修饰的方法叫做虚方法 •虚方法可以在子类中通过override关键字来重写 •常见的虚方法 ...
- android设置按钮按下的不同效果图
<!-- 按钮设置按下去的不同效果的方式,设置android:background属性, 下面的 button_select实际上是button_select.xml --> <Bu ...
- C#学习日记之数据库连接
一.webconfig设置和参数解释 在C#中新建一个网站时,webconfig文件中会有一个默认的数据库连接语句,如下 <connectionStrings> <add name= ...
- C# Thread Programming Start
引言 1.理解多线程 2. 线程异步与线程同步 3.创建多线程应用程序 3.1通过System.Threading命名空间的类构建 3.1.1异步调用线程 3.1.2并发问题 3.1.3线程同步 3. ...
- Fedora最小化安装后没有ifconfig命令
百度了很久,都说添加export PATH=$PATH:/sbin,结果我用whereis 查询了,根本没有这个命令.后来直接yum search ifconfig,查找到原来是net-tools包. ...
- 数据切分——MySql表分区概述
定义: 表的分区指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在M ...
- lines(最大区间和)
lines Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 使用SharedPreferences即时存储之后,不能即时获取到数据
在这里简介一下我所遇到的情况,由于情况非常特殊,所以我就来记录一下自己在这个方面的经历! 事由:在我所做的app中有一个视频的播放功能,因为之前做优化的时候.我听说对于视频这种比較耗费资源的应该给他独 ...
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
之所以专门为struct的长度写一篇測试,是由于原来c++对于struct的变量, 在分配内存的时候,c++对struct有一种特殊的存储机制. 看以下的測试: 一.在Windows7 32bit , ...
- C# 中根据datetime的值来计算属于本年的第几周,类似delphi中的weekoftheyear功能
/// <summary> /// 获得今天是今年的第几周 /// </summary> /// <param name="year">< ...