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. WCF跟踪分析 使用(SvcTraceViewer)

    1.首先在WCF服务端配置文件中配置两处,用于记录WCF调用记录! A:<system.serviceModel>目录下: <diagnostics>      <mes ...

  2. C#变量命名规范

    1.1命名 1.  所有命名必须有意义 2.  成员变量声明在类的顶端,并且每个变量一行 3.  局部变量声明在引用之前 1.1.1  常量命名 1.  常量名用全大写:MAX_PARAMETER_C ...

  3. python3基本框架

  4. Zookper

    http://blog.csdn.net/yangbutao/article/details/11669609 http://www.oschina.net/code/snippet_255033_2 ...

  5. 周根项《一分钟速算》全集播放&amp;下载地址

    点击图片就可以观看 ↓↓↓↓↓↓↓↓ 第1章:指算法 周根项<一分钟速算>第1章:指算法 第一节 对手的认识 周根项<一分钟速算>第1章:指算法 第二节 个位数比十位数大1乘以 ...

  6. Asp.Netserver控件开发的Grid实现(三)列编辑器

    以下是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...

  7. iOS7支持九宫格

    Beta4支持九宫格 还没试,等最终版把,现在的有很多bug还比较费电 看网上有人说虽然终于出来了但是还是不如百度搜狗等输入法方便 前几个月在weiphone上还有人问支不支持结果回帖的都说没戏 这算 ...

  8. ThinkPHP - 图片水印

    图片添加水印 可以通过使用Image类的水印方法给图片添加水印支持,例如:water 给图片添加水印 用法   water($source, $water, $savename=null, $alph ...

  9. Tomcat免安装版的环境变量配置以及Eclipse下的Tomcat配置和测试

    Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程 重新记录下来,以便以后如果忘记了可以随时查看. 注意:首先要明确 ...

  10. A. Case of the Zeros and Ones----解题报告

    A. Case of the Zeros and Ones Description Andrewid the Android is a galaxy-famous detective. In his ...