Как получить защиту уровня действия с помощью authlogic и sti?
-
20-09-2019 - |
Вопрос
Учитывая, что хорошо документировано, как использовать перед_фильтер для одной классификации пользователя, у меня возникают проблемы с получением защиты на уровне действий для нескольких типов пользователей. Позволь мне объяснить:
У меня есть что -то подобное ...
class ApplicationController < ActionController::Base
class << self
attr_accessor :standard_actions
end
@standard_actions = [:index, :show, :new, :edit, :create, :update, :destroy]
def require_guardian
unless current_user and current_user.is_a?(Guardian)
store_location
redirect_to home_url
return false
end
end
def require_admin
unless current_user and current_user.is_a?(Administrator)
store_location
redirect_to register_url
return false
end
end
end
А в GuardiansController я хочу разрешить только стандартные действия для администратора, но все остальные действия должны требовать Guardian. Итак, я попробовал это ...
class GuardiansController < ApplicationController
before_filter :require_admin, :only => ApplicationController::standard_actions
before_filter :require_guardian, :except => ApplicationController::standard_actions
...
end
Что в конечном итоге делает рекурсивное перенаправление. Должен быть лучший способ?
Решение
Хорошо, это еще один случай, когда я не смотрел и что -то пропустил. Я непреднамеренно установил маршрут для перенаправления пользователя рекурсивно. Приведенное выше решение работает просто нормально, когда вы правильно устанавливаете маршруты:
def require_guardian
unless current_user and current_user.is_a?(Guardian)
store_location
# this route (home_url) sent the user to another controller which ran a before_filter sending them back here again.
# redirect_to home_url
# So I changed it to a neutral route and it works great!
redirect_to register_url
return false
end
end