Mongoid和Cancan角色继承/每个用户的许多角色

时间:2012-05-30 08:33:24

标签: ruby-on-rails ruby devise mongoid cancan

我正在玩Mongoid(NoMySQL数据库),DEVISE和CANACN

我已阅读手册(https://github.com/ryanb/cancan/wiki/Role-Based-Authorization), 但我不想使用“roleMask” - 计算。我想使用Array(或Hash)-field代替,包含用户的角色。

class User
  include Mongoid::Document
  field :email, :type => String, :null => false
  field :roles, :type => Array, default: -> { ['User'] if new_record?}

这有可能吗?什么时候,如何? : - )

非常感谢提前

1 个答案:

答案 0 :(得分:3)

Cancan并不关心你的角色是如何运作的 - 你的能力文件是纯粹的红宝石所以逻辑完全取决于你。例如,你可能有这个能力:

can :manage, Product

如果要将此限制为其角色数组包含特定值的用户,则可以执行

if user.roles.include?('Admin')
  can :manage, Product
end

由于你的能力只是一个红宝石课,你可以做任何你可以用红宝石表达的东西。

有多种处理继承的方法,cancan wiki中列出了两种方法。

一种方法涉及更改检查角色的方式:如果您使用admin?方法,那么它不仅会检查是否存在管理员角色,还会检查是否存在任何其他角色继承所有访问权限。

另一种方法是将您的能力文件拆分为以角色命名的方法,例如编辑器角色的所有语句都在editor方法中,manager方法包含所有语句管理员角色等。例如,如果管理员需要继承编辑器的访问权限,则从editor调用manager方法。