que - spring security wikipedia
Sal de seguridad de primavera (1)
Usted no autoriza el SaltSource
cuando agrega un usuario. SaltSource
es una abstracción utilizada por Spring para proporcionar la fuente del salt para la comprobación de contraseñas solamente .
Para crear un hash de contraseña codificado correctamente Acabas de pasar el SaltSource
a PasswordEncoder
, el valor de la propiedad de username
de username
, no de SaltSource
:
private PasswordEncoder encoder = new Md5PasswordEncoder();
public User createUser(String username, String plainTextPassword) {
User u = new User();
u.setUsername(username);
u.setPassword(encoder.encodePassword(plainTextPassword, username));
getEntityManager().persist(u); // optional
return u;
}
Además, el autowire de SaltSource
no funcionará hasta que se defina como un bean interno. Podría definir ReflectionSaltSource
como bean de nivel superior y pasar su ID al password-encoder
, es decir:
<bean id="saltSource"
class="org.springframework.security.authentication.dao.ReflectionSaltSource"
p:userPropertyToUse="username" />
<bean id="passwordEncoder"
class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"
p:passwordEncoder-ref="passwordEncoder"
p:saltSource-ref="saltSource"
p:userDetailsService-ref="userDetailsService" />
<authentication-manager>
<authentication-provider ref="daoAuthenticationProvider" />
</authentication-manager>
Y entonces:
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private SaltSource saltSource;
public CustomUserDetails createUser(String username, String plainTextPassword) {
CustomUserDetails u = new CustomUserDetails();
u.setUsername(username);
u.setPassword(passwordEncoder.encodePassword(
plainTextPassword, saltSource.getSalt(u)));
getEntityNamager().persist(u); // optional
return u;
}
Estoy tratando de agregar un salt al agregar un nuevo usuario / pwd, pero a los documentos parece que les falta cómo hacerlo.
Aquí hay un ejemplo básico:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5">
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
Puede ver en el ejemplo que no se utiliza un codificador de contraseña personalizado o de sal personalizado.
Entonces, ¿cómo conectaría el Salt al agregar un nuevo usuario / pwd? Asumiría que sería algo como:
@Autowired SaltSource saltSource;
protected void foo(final CustomUser user) {
final PasswordEncoder encoder = new Md5PasswordEncoder();
user.setPassword(encoder.encodePassword(user.getPassword(), saltSource));
}
Sin embargo, ya que estoy usando los codificadores predeterminados de sal / contraseña y no tengo un bean de sal personalizado, el autowire fallaría.
¿Alguna pista de cómo hacer que esto funcione?