Rails可配置授权每个角色/ crud操作

时间:2011-10-24 10:10:12

标签: ruby-on-rails authorization cancan declarative-authorization acl9

我正在使用已经使用declarative_authorization处理用户权限的Rails 2.3应用程序。每个用户属于一个组(没有花哨的角色),对某些模型具有权限,主要是常规的CRUD操作,但有一些特殊的操作。这一切都适用于declarative_authorization,通常是开箱即用模式。

我们现在希望允许管理员根据模型类型设置特定用户组的权限。例如,我们创建一个新组Foo,为其分配一些用户,然后使用复选框决定组Foo中的用户是否可以c / r / u / d模型栏的对象。

我之前使用过acl9,我想我知道如何才能做到这一点。我最近一直是CanCan的粉丝,但我看看它是如何轻松的。如果declarative_authorization可以做到这一点,我会坚持下去,但我已经准备好咬紧牙关并切换。

什么插件是实现此目的的最佳方式?有没有办法让declarative_authorization来完成这项工作?使用CanCan的优雅方式?有没有我应该注意的问题,例如数据库性能?

我可以确信将应用程序升级到Rails 3.1,但我更愿意找到兼容2.3的解决方案。

我见过一些类似的问题,但没有令人满意的答案 Rails Dynamic Role-Based Authorization plugin?

这对于康康来说 https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

1 个答案:

答案 0 :(得分:0)

我是StoneWall gem的粉丝 - 授权检查采用Ruby块的形式,因此在该块中,您可以查找记录并查看相关用户是否具有授权。

没有很多文档,但想法是:

a_user_object.may_read?(object)

如果object是Todo实例,那么Stonewall将查看Todo模型并执行read

# app/models/todo.rb

stonewall do |s|

    s.action :read do |todo, user|
      todo.owner == user  # only the owner of a todo item may read the item
    end
end

这种方法简化了两件事:

  1. read只是一个Ruby块,所以无论你想发生什么事都可以发生
  2. 操作可以被赋予任意名称,因此如果您想检查用户是否有权对待办事项项进行评论(例如),只需创建s.action :comment并使用{{1}进行访问即可}