Как настроить политики авторизации для двух контроллеров с помощью Pundit?

Я изучаю Pundit, используя RailsApps Pundit Tutorial, и это утверждение из урока полностью смутило меня:

Учитывая, что объект политики называется UserPolicy, и мы будем использовать его для авторизации от контроллера Users, вы можете ошибочно предположить, что имя объекта политики всегда будет совпадать с именем контроллера. Это не относится к делу.

  1. Как я могу создать политику (набор политик), которая позволяет пользователям с "role_a" использовать действие users_controller.index и пользователям с "role_b" использовать действие orders_controller.index?

    1.1 Требуется ли для этого две разные политики (UserPolicy и OrderPolicy) или мне нужно по-разному называть действие индекса для каждого контроллера, чтобы дифференцировать его в UserPolicy?

1 ответ

Решение

Да, для этого требуются две разные политики (UserPolicy и OrderPolicy)

#user_policy.rb
class UserPolicy
attr_reader :current_user

  def initialize(current_user)
    @current_user = current_user
  end

  def index?
    @current_user.role_a?
  end
end

И в твоем index метод users_controller

def index
  @user = User.find(params[:id])
  authorize @user
end

То же самое для OrderPolicy

#order_policy.rb
class OrderPolicy
attr_reader :current_user

  def initialize(current_user)
    @current_user = current_user
  end

  def index?
    @current_user.role_b?
  end
end

И в твоем index метод orders_controller

def index
  @user = User.find(params[:id])
  authorize @user
end
Другие вопросы по тегам