Zabeg Issues
Решение проблемы с current_user в Rails с использованием Pundit
Обзор
Этот документ описывает проблему и её решение в приложении Rails, использующем Pundit для авторизации и JWT для аутентификации в контексте API.
Описание проблемы
В приложении Rails current_user возвращал nil в контексте политик Pundit, что приводило к сбоям в авторизации. Эта проблема наблюдалась при выполнении API-вызовов, требующих аутентификации пользователя и последующих проверок авторизации.
Причина
- Контекст пользователя в Pundit: Политики Pundit требуют контекста пользователя (обычно
current_user) для оценки правил авторизации. Однако в настройках API с использованием токен-базированной аутентификации current_user не был правильно распознан в рамках политики. - Связь контроллера и политики: API-контроллеры, наследующие от
Api::BaseController, неэффективно передавали аутентифицированногоcurrent_userв область политики Pundit.
Решение
Решение заключалось в обеспечении корректной установки и доступности current_user в контексте политики.
Принятые Меры:
- Определение
current_userвApi::BaseController: Убедились, чтоcurrent_userопределён и возвращает@current_user, который устанавливается через токен-базированную аутентификацию:def current_user @current_user end - Настройка Policy Scope: Изменили класс
ScopeвUserPolicyдля приёмаcurrent_userв качестве аргумента и правильного определения области в зависимости от роли пользователя (администратор или обычный пользователь):
class Scope
attr_reader :current_user, :scope
def initialize(current_user, scope)
@current_user = current_user
@scope = scope
end
def resolve
if @current_user.admin?
scope.all
else
scope.where(id: @current_user.id)
end
end
end
- Обновление инициализации Scope в контроллере: Явно передали
current_userв область политики в контроллере:
def index
@users = policy_scope(User, policy_scope_class: UserPolicy::Scope)
authorize @users
render json: @users
end
Заключение
Убедившись, что current_user правильно распознаётся как в API-контроллере, так и в контексте политики Pundit, проблема была успешно решена. Эта настройка критически важна для приложений, которые используют как токен-базированную аутентификацию для API, так и Pundit для авторизации.