2010-07-01 21 views
5

Tengo un proveedor de autenticación personalizada definido en mi configuración Spring Security. Esta clase implementa AuthenticationProvider, y puedo iniciar sesión exitosamente usando el formulario definido en mi página. El problema es que quiero llamar a esta clase no solo en la página de inicio de sesión, sino también desde la página de registro.Spring - Llamar al proveedor de autenticación personalizada desde un controlador

La página de registro utiliza una clase de comando diferente y recopila más información que el formulario de inicio de sesión. En este momento, cuando el usuario se registra, llamo al controlador apropiado, agrego el registro a la base de datos y luego pueden iniciar sesión pero no están conectados automáticamente. Como me acaban de dar su nombre de usuario/contraseña en la página de registro, ¿puedo pasar esto a la clase personalizada AuthenticationProvider para que también inicien sesión?

He intentado crear una clase org.springframework.security.Authentication en el controlador de registro y llamar al método de autentificación en la clase AuthenticationProvider de mi cliente, y esto no da error, pero el usuario no ha iniciado sesión. ¿Tengo que llamar a un método más alto en la cadena de filtros Spring Security para lograr esto? ¿Debería redireccionar el controlador a la URL j_spring_security_check? De ser así, ¿cómo pasaría el nombre de usuario/contraseña?

Respuesta

1

Necesita poner el resultado de AuthenticationProvider.authenticate() en SecurityContext (obtenido de SecurityContextHolder).

También tenga en cuenta AuthenticationSuccessEvent - si su aplicación depende de este evento (algunas funciones de Spring Security también pueden usarlo), debe publicarlo (puede obtener el valor predeterminado AuthenticationEventPublisher mediante autoencendido). Puede ser útil envolver su proveedor de autenticación con ProviderManager, publica el evento automáticamente utilizando el editor dado.

2

El problema que tiene es que, aunque se haya autenticado con éxito el usuario no ha guardado el resultado de esta autentificación en el usuario de SecurityContext. En una aplicación web this is a ThreadLocal object que SecurityContextPersistenceFilter usará para store the user's credentials in the HTTPSession

También debe evitar autenticarse directamente con su proveedor de autenticación personalizado si puede. Su configuración xml debe contener un AuthenticationManager al cual se ha conectado su proveedor de autenticación personalizado. Por ejemplo,

<bean id="customAuthenticationProvider" 
    class="com.foo.CustomAuthenticationProvider"> 
    <property name="accountService" ref="accountService"/> 
</bean> 
<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="customAuthenticationProvider"/> 
</security:authentication-manager> 

Si cablea el authenticationManager en su servicio de registro y la autenticación mediante que será, además,

Nuestro servicio de registro hace esto de la siguiente manera

final UsernamePasswordAuthenticationToken authRequest = new 
    UsernamePasswordAuthenticationToken(username, password); 

final Authentication authentication = 
    authenticationManager.authenticate(authRequest); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

También almacenamos opcionalmente el resultado de la autenticación en este momento en un recuerdo -me cookie utilizando el método de TokenBasedRememberMeServicesonLoginSuccess().

Cuestiones relacionadas