Ограничить просмотр для различных ролей в Pundit
Я следую за проблемой, которая у меня была раньше. Я смог заставить код работать для трех ролей, но мне нужно включить 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 ответа
Можете ли вы попробовать изменить этот метод:
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
Вы должны изменить свой запрос, чтобы иметь обе роли.
Я понял, что я должен был сделать. Это был двухступенчатый процесс. Во-первых, мне пришлось изменить роль на числовое значение, которое pundit хранит как вместо строки, поэтому role
будет 0 и 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