2011-12-28 18 views
6

me gustaría añadir sal como:sal Spring Security para DetallesUsuario personalizados

PasswordEncoder encoder = new ShaPasswordEncoder(); 
     userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails)); 

en la medida de userDetails es ejemplo de mi clase personalizada UserDetail, i obligado a echarlo a esta clase de primavera: UserDetails , sino como se espera lógicamente que me dieron en tiempo de ejecución:

java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails 

config:

<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> 
     <beans:property name="userPropertyToUse" value="username"/> 
</beans:bean> 

<authentication-manager alias="authenticationManager"> 
<authentication-provider> 
<password-encoder hash="sha"> 
    <salt-source user-property="username"/> 
</password-encoder> 
    <jdbc-user-service data-source-ref="dataSource"/> 
</authentication-provider> 
</authentication-manager> 

¿Cómo puedo configurar sal correctamente en este caso?

Respuesta

3

ReflectionSaltSource sólo funciona con un objeto UserDetails (estoy asumiendo que es donde se obtiene la excepción de difusión de clase?), Por lo que tendría que poner en práctica ya sea UserDetails o crear su propio SaltSource aplicación que funciona con su objeto.

Sin embargo, no utilizaría una propiedad del usuario como la sal a menos que esté trabajando con un sistema heredado que ya lo hace. El nombre de usuario no es un muy buen valor de sal. Es mucho mejor usar una sal aleatoria almacenada con la contraseña. Un buen ejemplo es el algoritmo BCrypt. Vea mi respuesta al this question para ver un ejemplo de cómo usarlo con Spring Security 3.1. Como se explica allí, BCrypt genera automáticamente una sal aleatoria que almacena en la misma cadena que la contraseña hash.

Tenga en cuenta que en realidad hay una nueva interfaz PasswordEncoder en el paquete "crypto" de Spring Security 3.1 (en org.springframework.security.crypto.password). Esto no incluye una sal en el API methods, ya que supone que la sal se genera internamente (como ocurre con la implementación de BCrypt). El marco generalmente aceptará uno de estos o el legado org.springframework.security.authentication.encoding.PasswordEncoder.

+0

+1 para 'BCryptPasswordEncoder' – Roadrunner

+0

@Luke, según tengo entendido por su publicación vinculada,' BCrypt' ya contiene Salt.¿Cómo puedo configurar Salt en este caso? ¿Es configurable en absoluto, cuando se usa 'BCrypt'? Allí decía:" Esto genera automáticamente una sal y la concatena con el valor hash en una sola cadena " – sergionni

+1

@sergionni: fíjese en el cambio de la API en Spring Security. En 3.0.x, [PasswordEncoder] (http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/encoding/PasswordEncoder.html) utiliza la sal para codificar la contraseña Pero en 3.1.x, el [PasswordEncoder] (http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html) doesn ' usar la sal El consejo de Luke es para la versión 3.1.x ** solo **. – Roadrunner

1

Su clase model.UserDetails debe implementar la interfazorg.springframework.security.core.userdetails.UserDetails- no tiene por qué ser una clase org.springframework.security.core.userdetails.User.

También puede echar un vistazo a this answer para ver cómo configurar un ReflectionSaltSource tanto para codificar y decodificar contraseñas, o ayudarle a obtener la imagen más grande para seguir gran punta de Lucas en BCryptPasswordEncoder.

+0

Vi su publicación antes. Como entiendo, la clase 'CustomUserDetails' en ella implementa' UserDetails' de Spring, ¿no? El caso es que no necesito implementarlo por ahora. Mi costumbre 'UserDetails' es bastante pequeño y es suficiente. – sergionni

+1

@sergionni: este fue solo un marcador de posición de ejemplo: puede usar cualquier implementación de 'org.springframework.security.core.userdetails.UserDetails' en lugar de 'CustomUserDetails'; puede ser suyo, ya sea pequeño o con características especiales, o el uno provisto con el marco 'org.springframework.security.core.userdetails.User'. La parte principal de mi publicación fue sobre la configuración del 'SaltSource' sin embargo. – Roadrunner

Cuestiones relacionadas