【问题标题】:Attribute level authorization using cancancan in rails在 Rails 中使用 cancancan 进行属性级别授权
【发布时间】:2018-07-03 10:04:26
【问题描述】:

我正在使用 cancan 进行授权。 我有不同的管理员角色,我想根据他们的角色(管理员,mega_admin)向他们展示特定的列。基本上我想做这样的事情。

index do
 selectable_column
 column :first_column if can? :read_first_column #visible to mega_admin only
 column :second_column if can? :read_second_column
 actions
end

cancancan 不提供属性级授权,我该怎么做?

【问题讨论】:

    标签: ruby-on-rails activeadmin cancancan


    【解决方案1】:

    您可以尝试版本 3.0 (https://github.com/CanCanCommunity/cancancan/tree/feature/3.0.0) 和属性级别权限功能 (https://github.com/CanCanCommunity/cancancan/tree/feature/3.0.0#version-30)。

    请注意,目前尚未发布,因此您必须从 github 包含它:

    gem 'cancancan', github: 'CanCanCommunity/cancancan', branch: 'feature/3.0.0'.

    使用版本 3 时,您可以定义:

    can :read, ModelClass, :first_columnn
    can :read, ModelClass, :second_columnn
    

    【讨论】:

    • authorize_resource 是否检查了属性级权限?我一直在尝试在特定属性上禁止update,在before_action 中分配更新的参数,似乎并没有禁止它。似乎只有当我在动作中调用authorize! @task, :update, :priority 时才有效。我对 CanCanCan 的期望是检查禁止属性是否通过脏属性 (priority_changed?) 进行了更改,并相应地进行了透明授权,而不是用大量 authorize 使我的控制器膨胀。你有什么建议吗?
    【解决方案2】:

    您必须define an Ability 和之后的check on it

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        user ||= User.new
        if user.mega_admin? // here 
          can :mega_manage, :all
        else if user.admin?
          can :manage, :all
        else
          can :read, :all
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多