Ruby on Rails (5)

这次的目标是使用devise+cancan+rolify建立完整的权限管理系统,恩,听起来好高端的样子,其实还是蛮简单的。下面就开始我们的学习吧。

首先,还是先简单介绍一下这几个组件:

devise:  负责用户注册、登录、退出、找回密码等操作。细节参考devise on github

cancan: 负责角色建立、对角色授权、在页面中根据授权是否显示元素,以及模型中超出授权时抛出异常。细节参考cancan on github

rolify:      负责将用户与角色关联。细节参考rolify on github

下面就开始一步步的使用这三个组件。


1.新建一个简单的rails项目(cmd中)

rails new PassPort -d=mysql

2.集成devise

(1).在本地Gemfile包含devise,并再次运行bundle install

gem 'devise'   #在Gemfile文件中写

(2).执行devise初始化

rails g devise:install

这句命令会产生一个用户指南,告诉你该做的几件事请,以下是内容翻译(已经去除heroku部署的那一条,增加了登录退出选项的说明):


a. 确定你的环境中有一个缺省的URL,config/environments/development.rb:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }
如果在production环境, :host 必须设置成应用的真实主机名。


b.确定已经在config/routes.rb中定义了root_url(注意删除public下面的index.html), 例如:

root :to => "home#index"
可以使用下面命令生成一个home#index的页面:
rails g controller home index

c.在app/views/layouts/application.html.erb中增加消息提醒,例如:

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

d.很多时候还需要增加登录、退出的选项:

   <% 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 %>

e.如果要定制Devise的view模型,可以再执行以下语句:

rails g devise:views

(3).生成用户模型(你可以使用其他名称代替User),并执行数据迁移

rails g devise User
rake db:create         #可能需要输入密码
rake db:migrate

(4).在Controller中增加认证过滤,即可在访问该模型页面时转向用户登录页面
在需要认证的模型中,如HomeController,增加下面代码:

before_filter :authenticate_user!

3.集成cancan和rolify

cancan提供对资源的授权控制。例如,在视图中使用can?方法来决定是否显示某个页面元素。如果系统角色非常简单,那么cancan还在代码中直接指定常量就可以支持,具体操作可以参考官方文档。但要提供复杂的角色管理,最好的方案,还是在devise基础上再集成cancan+rolify。

(1)修改Gemfile

gem 'cancan'
gem 'rolify'  
再次运行bundle install
bundle install

(2)创建cancan的Ability和rolify的Role

rails g cancan:ability
rails g rolify:role
rake db:migrate

(3)定制devise用户注册事件,可以在注册时赋予用户rolify角色,例如,下面的代码为首个用户赋予admin角色:

 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”资源:

 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页面中增加如下代码:

 <% if user_signed_in? %>
        <p>The user is loged in.</p>
        <%= link_to "Students", students_path   %>
 <% end %>

(6)使用scaffold生成Student的crud

rails g scaffold Student name:string sex:string age:integer


(7)Studnet数据迁移

rake db:migrate

(8)启动服务器,验证。


点击下载源码:PassPort源码   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值