1

我正在使用已经使用declarative_authorization来处理用户权限的Rails 2.3应用程序。每个用户都属于一个组(没有花哨的角色),对某些模型拥有权限,主要是常规的CRUD操作,但有一些特殊的操作。这一切都可以正常工作,在通常的开箱模式下使用declarative_authorization。Rails可配置授权每角色/ crud行动

我们现在想允许管理员针对模型类型设置特定用户组的权限。例如,我们创建一个新的组Foo,将一些用户分配给它,然后使用复选框决定组Foo中的用户是否可以使用模型Bar的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

回答

0

我是StoneWall宝石的粉丝 - 授权检查是形式一个Ruby块,所以在这个块中你可以查找记录并查看相关用户是否有授权。

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

a_user_object.may_read?(object) 

如果object是一个TODO实例,那么石墙看起来INT待办模型和执行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. 可以给动作赋予任意名称,所以如果你想检查一下用户是否有权评论一个todo项目(例如),只需创建一个s.action :comment并访问它与a_user_object.may_comment?(object)