Grails Spring Security: el inicio de sesión con una URL de destino omite el flujo de trabajo posterior a la autenticación
En mi aplicación Grails, he personalizado el flujo de trabajo posterior a la autorización al escribir un controlador de éxito de autenticación personalizado (en resources.groovy) como se muestra a continuación.
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 puede de las últimas tres líneas en el cierre anterior, dependiendo de la función otorgada al inicio de sesión del usuario, la estoy redirigiendo a acciones separadas dentro de laAdminController donde se crea un UserSessionBean personalizado y se almacena en la sesión.
Funciona bien para un caso de inicio de sesión regular que en mi aplicación es así:
El usuario llega a la aplicación a través dehttp://localhost:8080/my-app/
Ohttp://localhost:8080/my-app/login/auth
Ella ingresa su nombre de usuario y contraseña válidos y continúa.La aplicación accede internamente a MyAuthSuccessHandler que redirige a AdminController considerando el rol otorgado a este usuario.El UserSessionBean se crea y almacena en la sesiónEl usuario es llevado a la página de inicio de la aplicación.También he escrito una costumbre.MyUserDetailsService
extendiendoGormUserDetailsService
que se accede correctamente en el flujo anterior.
Problema del escenario
Considere un usuario que accede directamente a un recurso protegido (en este caso, el controlador está protegido con@Secured
anotación) dentro de la aplicación.
http://localhost:8080/my-app/inbox/index
La aplicación la redirige ahttp://localhost:8080/my-app/login/auth
El usuario ingresa su nombre de usuario y contraseña válidosEl usuario es llevado ahttp://localhost:8080/my-app/inbox/index
losMyAuthSuccessHandler
se omite por completo en este proceso y por lo tanto miUserSessionBean no se crea, lo que lleva a errores en el uso posterior en lugares dondeUserSessionBean se accede.
PREGUNTAS:
En el escenario problemático, ¿la aplicación omite elMyAuthSuccessHandler
¿Porque hay una URL de destino para que se redirija al iniciar sesión?¿Podemos obligar al proceso a pasar siempre?MyAuthSuccessHandler
incluso con la URL de destino presente?Si la respuesta a 2 es no, ¿hay una alternativa en cuanto a cómo y dóndeUserSessionBean todavía se puede crear?