2012-02-15 15 views
5

Tener sencilla aplicación web Spring Security con codificación de contraseña:Autenticación en la primavera de Seguridad un poco con la contraseña codificada

<security:authentication-manager alias="authenticationManager"> 
<security:authentication-provider user-service-ref="personService"> 
    <security:password-encoder hash="md5" ref="passwordEncoder"> 
     <!-- <security:salt-source user-property="username"/> --> 
    </security:password-encoder> 
</security:authentication-provider> 
</security:authentication-manager> 

Codificación también sencilla:

person.setPassword(encoder.encodePassword(person.getPassword(), null)); 

Así que la base de datos se codificará todas las contraseñas. Ahora quiero hacer la autenticación de algún usuario con cierto nombre de usuario dentro de la aplicación. Antes (cuando fue passswords en texto plano) fue la siguiente:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       username, password); 
Authentication authentication = authenticationManager.authenticate(token); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Pero ahora tengo codificado contraseña de base de datos y no puede hacer la autenticación como antes.

El problema. That Spring no sabe que la contraseña proviene de UsernamePasswordAuthenticationToken ya codificada. Y lo está codificando por segunda vez. ¿Quién puede ayudar?

Editar

lo tanto, veo dos soluciones aquí:

  1. implementar DaoAuthenticationProvider personalizada, en la añada de verificación si ambas contraseñas hash ya
  2. implementar la autenticación personalizada y la puso en el contexto de seguridad de forma manual.

¿Algún otro? ¿Que es lo mejor?

+0

compuesto por algunos de SpringSecurity en [detalle] (http://techastute.blogspot.com /2013/01/spring-security-in-detail.html), puede ser útil para alguien. – raksja

Respuesta

7

En realidad, no ha dicho qué es lo que falla, pero el código de autenticación debe ser exactamente el mismo que el de la versión sin hash.

Si tiene una contraseña hash en la base de datos y el codificador correspondiente inyectado en el proveedor de autenticación, la contraseña proporcionada por el usuario será codificada por el codificador antes de compararla con la versión de la base de datos.

Asegúrese de que:

  1. se utiliza el valor de la contraseña sin troceo al crear el UsernamePasswordAuthenticationToken
  2. El valor en la base de datos realmente es el mismo que el hash producido por el codificador. Carguelo usted mismo y verifíquelo en una prueba. La base de datos puede estar almacenándolo en mayúsculas, por ejemplo.

Además, probablemente debería elegir algo mejor que el simple MD5. Es posible que desee ver bcrypt, por ejemplo, que es compatible con Spring Security 3.1 y utiliza automáticamente un valor de sal aleatorio.

actualización

Tu sugerencia de crear un proveedor que acepta contraseñas hash no es una buena idea. Esto permitiría que cualquier persona que robe un hash de contraseña se autentique directamente con él (lo que en primer lugar frustra el uso del hash).

Sólo validar sus enlaces URL de correo electrónico, cargar la información de ese usuario y crear un objeto Authentication para ellos:

UserDetails user = ... // load user here 
Authentication a = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(a); 
+0

El problema está en 1. Al crear UsernamePasswordAuthenticationToken, solo tengo una versión hash de la contraseña al cargar el objeto UserDetails de DB (en mi caso, por clave de confirmación) – vacuum

+0

Usar la contraseña almacenada no autenticará al usuario (que supongo lo que estás tratando de hacer). Si no, tendrás que aclarar lo que intentas lograr. No tiene mucho sentido llamar al administrador de autenticación con una contraseña que usted sabe que es correcta por adelantado. –

+0

Estoy intentando autenticar al usuario, que hizo clic en un enlace desde el correo electrónico de registro. Así que el objeto UserDetails provino de DB mediante la clave de confirmación que provenía del enlace de confirmación en el correo electrónico. – vacuum

Cuestiones relacionadas