Como obter proteção do nível de ação usando authlogic e STI?
-
20-09-2019 - |
Pergunta
Dado que está bem documentado como usar antes_filter para uma única classificação de usuário, estou tendo problemas para obter proteção no nível da ação para vários tipos de usuário. Deixe-me explicar:
Eu tenho algo assim ...
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
E no GuardianScontroller, quero permitir apenas as ações padrão para o administrador, mas todas as outras ações devem exigir guardião. Então eu tentei isso ...
class GuardiansController < ApplicationController
before_filter :require_admin, :only => ApplicationController::standard_actions
before_filter :require_guardian, :except => ApplicationController::standard_actions
...
end
Que acaba fazendo um redirecionamento recursivo. Deve haver uma maneira melhor?
Solução
Ok, este é outro caso de não olhar com cuidado e perder algo. Inadvertidamente, eu havia configurado a rota para redirecionar o usuário de maneira recursiva. A solução acima funciona bem quando você define as rotas corretamente:
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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow