Grails Spring Security: Fazer login com um URL de destino ignora o fluxo de trabalho de autenticação de post
Em meu aplicativo grails, personalizei o fluxo de trabalho de pós-autorização escrevendo um manipulador de sucesso de autenticação customizado (em resources.groovy), conforme mostrado abaixo.
authenticationSuccessHandler (MyAuthSuccessHandler) {
def conf = SpringSecurityUtils.securityConfig
requestCache = ref('requestCache')
defaultTargetUrl = conf.successHandler.defaultTargetUrl
alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault
targetUrlParameter = conf.successHandler.targetUrlParameter
useReferer = conf.successHandler.useReferer
redirectStrategy = ref('redirectStrategy')
superAdminUrl = "/admin/processSuperAdminLogin"
adminUrl = "/admin/processAdminLogin"
userUrl = "/admin/processUserLogin"
}
Como você pode das últimas três linhas no fechamento acima, dependendo da função concedida ao usuário do logging, estou redirecionando-a para ações separadas dentro doAdminController onde um UserSessionBean customizado é criado e armazenado na sessão.
Funciona bem para um login normal, que no meu aplicativo é assim:
O usuário acessa o aplicativo por meio dehttp://localhost:8080/my-app/
OUhttp://localhost:8080/my-app/login/auth
Ela digita seu ID de login e senha válidos e continua.O aplicativo acessa internamente o MyAuthSuccessHandler, que redireciona para o AdminController considerando a função concedida a esse usuário.O UserSessionBean é criado e armazenado na sessãoO usuário é levado para a página inicial do aplicativoEu também escrevi um costumeMyUserDetailsService
estendendoGormUserDetailsService
que é acessado corretamente no fluxo acima.
CENÁRIO DE PROBLEMAS:
Considere um usuário acessando diretamente um recurso protegido (neste caso, o controlador é protegido@Secured
anotação) dentro do aplicativo.
http://localhost:8080/my-app/inbox/index
App redireciona-a parahttp://localhost:8080/my-app/login/auth
O usuário digita seu ID de login e senha válidosUsuário é levado parahttp://localhost:8080/my-app/inbox/index
oMyAuthSuccessHandler
é ignorado inteiramente neste processo e, portanto, meuUserSessionBean não é criado levando a erros após uso posterior em locais onde oUserSessionBean é acessado.
QUESTÕES:
No cenário do problema, o aplicativo pula aMyAuthSuccessHandler
porque há um URL de destino para o redirecionamento no login?Podemos forçar o processo a sempre passarMyAuthSuccessHandler
mesmo com o URL de destino presente?Se a resposta a 2 é não, existe uma alternativa sobre como e onde oUserSessionBean ainda pode ser criado?