cancan 笔记
来源:互联网 发布:paxos算法推导 编辑:程序博客网 时间:2024/05/12 11:47
cancan 笔记
Created at 9 months agoCanCan 使用
https://github.com/ryanb/cancan
基本流程
- Install
- Define Abilities
- Check Abilities & Authorization
Install
gem “cancan”
Define Abilities
生成权限定义文件
权限定义在类 Ability 中,放在 model,安装之后生成
rails g cancan:ability
定义权限
CanCan 的权限定义的上下文可以使用这5个元素:动作(action),主题类,主题类的实例,用户实例,条件判断语句。
例一:
class Ability include CanCan::Ability def initialize(user) user ||= User.new # guest user (not logged in) if user.admin? can :manage, :all else can :read, :all end endend
:manage,:read 称为权限的 action,内置对 REST 7 种 action 的支持,也可以随意定义 action,其实就是一个符号。
例二(Hash of Conditions)
can :read, Project, :active => true, :user_id => user.id
user 可以阅读 active 为 true,user_id 等于 user.id 的 project。
附:在 controller 中,可以用 projects = Project.accessible_by(current_ability)
获取当前用户允许阅读(:read)的 project。这个便捷方法称为 Fetching Records。
例三(Conditions with Block):
如果权限非常复杂,可以使用 block 作为条件。当 block 返回 ture 时权限通过,否则拒绝。
can :update, Project do |project| project.priority < 3end
例四(Overriding All Behavior)
更直接地定义权限,更复杂的定义可以用这种方式。但基本上用例三的 Block 就足够了。
can do |action, subject_class, subject| # ...end
Check Abilities & Authorization
can?、cannot? 判断
在 controller 和 view 中可以使用 can? 和 cannot? 方法判断用户对资源的访问权。
例:
controller:
can? :destroy, @projectcannot? :destroy, @project
view:
<% if can? :create, Project %> <%= link_to "New Project", new_project_path %><% end %>
注意:如果权限定义使用了条件判断,那么对类的权限检查总会返回 true
can :read, Project, :priority => 3can? :read, Project # returns true
authorize!
与 can? cannot? 的区别是授权失败时候会抛出 CanCan::AccessDenied 异常,可以通过在 ApplicationController.rb 里面用 捕获
in controller :
authorize! :read, Article, :message => "Unable to read this article."
in application_controller:
rescue_from CanCan::AccessDenied do |exception| redirect_to root_url, :alert => exception.messageend
应用场合
基于用户角色的授权
假设 user 有 role? 方法
# in Ability#initializeif user.role? :moderator can :manage, Postendif user.role? :admin can :manage, Threadendif user.role? :superadmin can :manage, Forumend
- cancan 笔记
- rails3beta4 + devise + cancan 打造权限管理系统
- 在Rails中用CanCan进行权限控制
- Rails Authentication with Devise and CanCan
- cancan 一用户多角色解决方案
- rails权限管理—devise+cancan+rolify
- Cancan权限角色设计的最佳实践
- 权限控制[2] CanCan + Rolify + Devise
- 权限控制[1] CanCan + Rolify + Devise
- Rails插件:CanCan权限验证插件学习总结
- rails gem开发实录之cancan的使用
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- 笔记
- WinCE7系统事件通知
- Win7下自解压Emeditor 10
- Tomcat处理HTTP请求源码分析(上)
- Tomcat处理HTTP请求源码分析(下)
- result_of学习
- cancan 笔记
- projection matrix
- android第二十天——手势识别
- 使用 Android NDK Stand-alone 交叉编译工具
- Selenium
- 高效 JavaScript
- 终于把工作给定了
- Apache Mahout 简介
- 腾讯 vs 百度