2012-02-20 5 views
8

Simplemente pregunta simple: ¿cuál es la mejor manera de agregar atributos (propiedades) a la autenticación HttpSession en el éxito? El ID de usuario por ejemplo.Spring Security: poner atributos adicionales (propiedades) en la sesión en el éxito Autenticación

Por ahora estoy usando mi propia aplicación SimpleUrlAuthenticationSuccessHandler en UsernamePasswordAuthenticationFilter y hacerlo de esta manera:

public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication auth) 
      throws IOException, ServletException { 
     PersonBean person = (PersonBean) auth.getPrincipal(); 
     request.getSession().setAttribute("currentUserId", person .getId().toString()); 
     super.onAuthenticationSuccess(request, response, auth); 

Pero no creo que esto es una buena aproximación, ya que hay otros modos de hacer la autenticación (RememberMe por ejemplo) .

¿Qué necesito usar aquí?

Respuesta

5

La respuesta fue en el foro de primavera. Link.

En general, es necesario implementar un ApplicationListener que escuche los eventos de éxito y coloque atributos adicionales en la sesión allí.

Pero en mi caso no es necesario almacenar atributos en la sesión. Puedo recuperar ID de usuario como aquí:

var userId = ${pageContext.request.userPrincipal.principal.id} 
-1

Spring hace todo esto por usted, tendrá que crear una tabla * persistent_logins *, aquí hay un fragmento del contexto de la aplicación que podría ayudar. Y del documento oficial yacía describe in detail lo que se requiere:

<security:http auto-config='true'> 
    <security:intercept-url pattern="/**" access="ROLE_USER" /> 
    <security:form-login login-page="/Login" 
    authentication-success-handler-ref="authenticationSuccessHandler" 
    authentication-failure-url="/Login?login_error=1" /> 
    <security:remember-me data-source-ref="dataSource" 
    user-service-ref="myUserService" /> 
</security:http> 

y luego se puede acceder al objeto principal de su cualquier lugar de su aplicación, por ejemplo siguiente se muestra la etiqueta de nombre de usuario de salida en jsp:

<sec:authentication property="principal.username" /> 

y de su código de Java esto se puede hacer:

MyUser user = (MyUser) authentication.getPrincipal(); 
+2

La tabla persistent_logins realmente no tiene nada que ver con el almacenamiento de atributos en la sesión. Esa es solo una implementación particular de recordarme a mí. Sin embargo, tiene sentido almacenar atributos de usuario personalizados adicionales en el objeto de autenticación. –

Cuestiones relacionadas