用于自定义UserDetails的Spring Security salt

ser*_*nni 6 configuration salt spring-security details

我想加盐如:

PasswordEncoder encoder = new ShaPasswordEncoder();
        userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));
Run Code Online (Sandbox Code Playgroud)

到目前为止userDetails我的自定义UserDetail类的实例,我不得不把它投射到这个Spring类:UserDetails ,但是从逻辑上预期我得到了运行时:

java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails
Run Code Online (Sandbox Code Playgroud)

配置:

<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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下如何正确配置

Sha*_*eep 3

ReflectionSaltSource仅适用于UserDetails对象(我假设这就是您获得类转换异常的地方?),因此您必须实现UserDetails或创建自己的SaltSource适用于您的对象的实现。

但是,我不会使用用户的属性作为盐,除非您正在使用已经这样做的遗留系统。用户名不是一个很好的盐值。最好使用与密码一起存储的随机盐。BCrypt 算法就是一个很好的例子。有关将其与 Spring Security 3.1 一起使用的示例,请参阅我对此问题的回答。正如那里所解释的,BCrypt 自动生成一个随机盐,并将其存储在与散列密码相同的字符串中。

PasswordEncoder请注意, Spring Security 3.1“crypto”包中实际上有一个新接口(在 参考资料中org.springframework.security.crypto.password)。这不包括API 方法中的盐,因为它假设盐是内部生成的(与 BCrypt 实现一样)。框架通常会接受其中之一或遗留的org.springframework.security.authentication.encoding.PasswordEncoder