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建立完整的权限管理系的更多相关文章

  1. rails权限管理—devise+cancan+rolify

    使用devise.cancan和rolify组件建立用户权限模型的说明. devise:负责用户注册.登录.退出.找回密码等操作.细节参考devise on github cancan:负责角色建立. ...

  2. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  3. [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置

    前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...

  4. [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

    本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...

  5. 10个基于 Ruby on Rails 构建的顶级站点

    本文系国内 ITOM 行业领军企业 OneAPM 工程师翻译整理自 Raviraj Hegde 的文章 Top Sites Built with Ruby on Rails. 就其本身而言,Ruby ...

  6. Ruby on Rails开发Web应用的基本概念

    Web应用架构 C/S架构 Web应用从最初就採用C/S架构.Server负责监听client请求,提供资源,Client向server发起请求并渲染页面.两者通过TCP/IP协议栈之上的HTTP协议 ...

  7. Ruby on Rails 實戰聖經阅读(二)

    1.操作系统 centos5.4 2.安装ruby yum install ruby 会安装得到 1.8.5 如果你公司用的是1.8.X就无所谓了, 拿这个学习就行了 如果你们公司用的是1.9.X,那 ...

  8. 开发环境准备:Ruby on Rails开发环境配置

    开发环境准备:Ruby on Rails开发环境配置 前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完 ...

  9. 开发新手最容易犯的50个 Ruby on Rails 错误(1)

    [编者按]本文最早发布与 JETRuby 博客,主要介绍了开发新手最容易犯的 Ruby 错误.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 一年前,我们创立了以 "Rubyboo ...

随机推荐

  1. C#常用控件缩写

  2. [C++参考]拷贝构造函数的参数必须是引用类型

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识.在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的.但是为什么呢? ...

  3. C++ Input & Output

    1.C++ I/O各类之间的继承关系图 参考网址: http://www.cplusplus.com/reference/iolibrary/ Note: 在程序中包含iostream文件将自动创建8 ...

  4. NET Core,你必须了解无处不在的“依赖注入”

    NET Core,你必须了解无处不在的“依赖注入” ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middle ...

  5. QT 遍历目录查找指定文件(比较简单)

    QString FindFile(const QString &strFilePath, const QString &strNameFilters){ if (strFilePath ...

  6. QT 强止杀进程

    bool KillProcess(QString ProcessName){  bool result = false; QString str1; HANDLE hSnapShot = Create ...

  7. Qt mac QMYSQL(动态加载插件QPluginLoader的用法)

    用此段代码查出问题所在 QPluginLoader loader; loader.setFileName("/Users/danny/Qt5.3.2/5.3/clang_64/plugins ...

  8. Qt下如何修改文件的时间(全平台修改)

    提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to ...

  9. BZOJ 1652: [Usaco2006 Feb]Treats for the Cows

    题目 1652: [Usaco2006 Feb]Treats for the Cows Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 234  Solve ...

  10. iOS中的图像处理(三)——混合运算

    有时候,单独对一张图像进行处理是很难或者根本达不到我们想要的效果的.一个好的滤镜效果的诞生,往往要经过很多复杂步骤.细致微调.图片应用效果观察以及很多图层叠加. 我在JSWidget上发现了一些常用混 ...