【问题标题】:Use CanCan to define permissions additively使用 CanCan 附加地定义权限
【发布时间】:2010-07-30 22:55:57
【问题描述】:

我的应用程序有 2 个角色:编辑者和管理员。我希望编辑者拥有一些权限,而管理员拥有所有编辑者权限以及一些其他权限。

这是我ability.rb的摘录

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_admin?
      can :edit, Post
    end

    if user.is_editor?
      can :edit, Post, :created_by_id => user.id
      can :read, Post
    end
  end
end

由于所有管理员也是编辑者,我希望这将定义这些权限:

  • 管理员可以阅读和编辑所有帖子
  • 编辑者可以阅读所有帖子,但只能修改他们创建的帖子

但是,CanCan 似乎没有附加地定义权限——即,当 CanCan 看到用户是编辑者(即使用户也是管理员),它会应用更严格的权限(即can :edit, Post, :created_by_id => user.id 而不是can :edit, Post)。

有没有办法解决这个问题?显而易见的解决方案需要重复代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_admin?
      can :edit, Post
      can :read, Post # NOT DRY!!!
    elsif user.is_editor?
      can :edit, Post, :created_by_id => user.id
      can :read, Post
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails cancan


    【解决方案1】:

    您是否尝试过使用块进行授权?

    can :edit, Post do |post|
     post.created_by_id == user.id || user.is_admin?
    end
    
    if user.is_editor?
      can :read, Post
    end
    

    【讨论】:

      【解决方案2】:

      为什么不重新定义编辑别名?你也可以这样做:

      can [:edit, :read], Post
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2014-01-09
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多