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 system
gem '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建立完整的权限管理系相关推荐
- Ruby on Rails 的秘笈是什么?
Ruby on Rails 的秘笈是什么? 我们能从 Rails 框架学到的经验 文档选项 将此页作为电子邮件发送 级别: 初级 Bruce Tate ([email]bruce.tate@j2lif ...
- rails使用devise验证
使用ruby on rails的好处之一就是有很多功能可以不用自己来实现,有很多开源的组件可以直接拿来用,达到项目的目的. 比如登陆安全验证,要让自己来写需要考虑很多: 1. session生命周期 ...
- ruby on rails_最终的中级Ruby on Rails教程:让我们创建一个完整的应用程序!
ruby on rails 由Domantas G (By Domantas G) There are plenty tutorials online which show how to create ...
- [rails] 我的订餐系统 -- 小试ruby on rails(转)
前言 近期在java社区中一种新的脚本语言ruby,及用ruby开发的一个wab框架 rails也热闹了起来.引起了不少的java开发人员的关注. 本人平时还是很少接触脚本语言方面东东 ...
- 新手安装ruby on rails(ror)的成功必备手册
2019独角兽企业重金招聘Python工程师标准>>> 如何快速正确的安装 Ruby, Rails 运行环境 每一位使用windows系统来进行ROR开发项目的都是这个世界上折翼的天 ...
- Ruby on Rails路径穿越与任意文件读取漏洞分析(CVE-2019-5418)
Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上.它被宣传为现有企业框架的一个替代,而它的目标,就是让 Web 开发方面的生活 ...
- Ruby on Rails开发Web应用的基本概念
Web应用架构 C/S架构 Web应用从最初就採用C/S架构.Server负责监听client请求,提供资源,Client向server发起请求并渲染页面. 两者通过TCP/IP协议栈之上的HTTP协 ...
- Ruby on Rails Exception:Routing Error
当开始做Ruby on Rails实际编程时,对于初学者而言总会有些让人感到未知的Exception, 上次以手工方式写了一个简单的Rails Application, 今天下午换用Red Rails ...
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...
最新文章
- ckeditor4.4.6添加代码高亮
- 残差学习,152层网络,微软夺冠2015 ImageNet计算机视觉识别挑战
- android多媒体编程题库,android 仿猿题库答题UI
- ppt android sdk,《0.AndroidSDK概述.ppt
- 目标检测系列(四)——Fast R-CNN译文
- 操作系统内存管理问题集锦
- 面对锁等待难题,数仓如何实现问题的秒级定位和分析
- 我辞掉程序员的工作,体验了半年的自驾游生活
- 阿里云发布聆听平台 全球招募300位MVP
- css内容过长显示省略号的几种解决方法
- win7系统补丁安装流程
- JAR包的JDK版本查看与设置
- vue验证码图片显示不出来,将图片转换为base64格式显示
- UE4_编辑器UMG关闭窗口不能立刻销毁UMG
- kappa系数简介---一致性与分类准确度指标
- 禁止迅雷极速版被强制升级为迅雷x
- Laya 将传统的bitmap字体 转换成 Laya可以识别的字体
- java 设计模式:软件设计原则、面向对象理论、23 种设计模式
- ICC2 user guide(三)Clock Tree Synthesis
- jdk1.8--JVM分析与调优
热门文章
- qt 怎么设计个性化的滑块_小小滑块大大学问,你真的会用滑块了吗?
- android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?
- python爬带用户名密码的网页_python爬虫用户名密码登录POST
- 【业务知识】企业数字档案馆总体架构图
- 【项目管理】认识沟通管理
- 信息系统项目管理师:第8章:项目质量管理(2)-章节重点
- linux idea 启动报错StartupAbortedException: Fatal error initializing plugin idea.plugin.protoeditor
- Got MethodID of ReferenceType that is not a member of the ReferenceType
- Java基础 HashMap实现原理及方法
- 笔记-项目管理基础知识-项目管理办公室(PMO)