Rails CanCan过于宽容的条件哈希

时间:2013-09-05 18:57:49

标签: ruby-on-rails permissions cancan

在使用条件哈希时,我遇到CanCan允许访问的问题,当我认为不应该访问时。

我有一个名为 projects 的rails模型/表,它控制对文档和集合(文档集)的访问。如果项目所有者给予了许可,则多个用户可以访问项目,称为协作者。还有一个协作者表,用于跟踪哪些用户可以访问哪些项目。

这一切都按预期使用单个权限或单个嵌套权限进行只读访问。例如,这适用于协作者:

can :read, Project, :collaborators => { :user_id => user.id }
can :read, Collection, :projects => { :collaborators => { :user_id => user.id } }
can :read, Document, :collection => { :projects => { :collaborators => { :user_id => user.id }}}

我遇到的情况是,所有者以外的用户可能需要管理项目。我称这些用户为“编辑”。为了检查编辑器,我在协作者表中有一个名为“editor”的布尔字段。为了允许编辑者访问,我在CanCan中创建了以下条件哈希:

can :manage, Project, :collaborators => { :user_id => user.id }, :collaborators => { :editor => true }

但是,如果任何协作者的编辑器字段为true,则此授予管理对所有协作者的访问权限。如果协作者也是编辑者,我只想授予协作者的管理访问权限,所有其他协作者应该只具有读取权限。由于上述能力不起作用,我有一个想法,我需要的是这样的:

can :manage, Project, :collaborators => { :user_id => user.id AND :editor => true}

但我不知道该怎么做。如果有帮助,我们使用PostgreSQL作为我们的数据库。感谢。

1 个答案:

答案 0 :(得分:0)

在谈到传递hash of conditions时,文档中对此进行了描述。语法不应使用AND,而应使用常规哈希:

can :manage, Project, :collaborators => { :user_id => user.id, :editor => true}