在专家中限制对各种角色的查看

时间:2014-12-29 18:40:03

标签: ruby-on-rails ruby ruby-on-rails-4 pundit

我正在跟进我遇到before的问题。我能够让代码适用于三个角色,但我需要在混合中包含4个角色。

问题:我有4个角色(用户,业务用户,超级用户和管理员)。管理员可以访问所有内容(用户索引)。超级用户只能看到用户和业务用户(用户索引)。

错误:我有一个功能正常的应用程序,允许管理员访问所有内容,但我的超级用户只能看到用户(而不是业务用户)。我尝试切换用户策略解析方法,为超级用户role: 'business_user'查看是否有效。好吧,它不起作用,只显示users(不是business_users)。这可能是我忽略的一个简单的红宝石问题。

用户政策

class UserPolicy
   attr_reader :current_user, :model

  def initialize(current_user, model)
    @current_user = current_user
    @user = model
  end

  class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
       @user = user
       @scope = scope
    end

    def resolve
      if user.admin?
        scope.all
      else user.super_user?
        scope.where(role: 'user')
      end
    end
  end

  def index?
    @current_user.admin? or @current_user.super_user?
  end
end

用户控制器

class UsersController < ApplicationController
  before_filter :authenticate_user!
  after_action :verify_authorized

  def index
    @users = policy_scope(User)
    authorize @users
  end
[rest of the controller]

用户模型

class User < ActiveRecord::Base
  enum role: [:user, :business_user, :super_user, :admin]
  [rest of model]
end

2 个答案:

答案 0 :(得分:0)

您可以尝试更改此方法:

def resolve
  if user.admin?
    scope.all
  else user.super_user?
    scope.where(role: 'user')
  end
end

由此:

def resolve
  if user.admin?
    scope.all
  else user.super_user?
    scope.where('role == "user" or role == "business_user"').all
  end
end

您必须更改查询才能同时拥有这两种角色。

答案 1 :(得分:0)

我想出了我必须做的事情。这是一个两步的过程。首先,我必须将角色更改为权威存储的数值,而不是字符串,因此role将为0&amp; 1.其次,我使用数组将它们输入到参数中,因此它可以接受多个选项。

 class Scope
    attr_reader :user, :scope

    def initialize(user, scope)
       @user = user
       @scope = scope
    end

    def resolve
      if user.admin?
        scope.all
      elsif user.super_user?
        scope.where(role: [1,0])
      else
        scope.none
      end
    end
  end