我想加盐:
PasswordEncoder encoder = new ShaPasswordEncoder();
userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));
到目前为止userDetails
是我的自定义UserDetail
类的实例,我不得不将它投射到这个春季班:UserDetails
,但正如我在逻辑上所期望的那样,我得到了运行时:
java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails
配置:
<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>
在这种情况下,如何正确配置 salt ?
答案 0 :(得分:3)
ReflectionSaltSource
仅适用于UserDetails
对象(我假设您获得了类转换异常?),因此您必须实现UserDetails
或创建自己的SaltSource
实现,适用于您的对象。
但是,除非您正在使用已经执行此操作的旧系统,否则我不会将用户的属性用作salt。用户名不是很好的盐值。使用随密码存储的随机盐要好得多。一个很好的例子是BCrypt算法。有关将其与Spring Security 3.1一起使用的示例,请参阅我对this question的回答。正如那里所解释的那样,BCrypt自动生成一个随机盐,它存储在与散列密码相同的字符串中。
请注意,Spring Security 3.1“crypto”包中实际上有一个新的PasswordEncoder
接口(在org.springframework.security.crypto.password
中)。这不包括API methods中的salt,因为它假定salt是内部生成的(就像BCrypt实现一样)。该框架通常会接受其中一个或遗留org.springframework.security.authentication.encoding.PasswordEncoder
。
答案 1 :(得分:1)
您的model.UserDetails
课程必须实施界面 org.springframework.security.core.userdetails.UserDetails
- 它不一定是类 org.springframework.security.core.userdetails.User
。
您还可以查看this answer,了解如何为编码和解码密码设置ReflectionSaltSource
,或者帮助您更全面地了解Luke在{{1 }}
答案 2 :(得分:0)
我在这里撰写了一篇关于其中一些细节的博文:http://rtimothy.tumblr.com/post/26527448708/spring-3-1-security-and-salting-passwords 卢克写了代码,所以他肯定知道他在说什么,但我看到很多人,包括我自己很难弄清楚这些信息,希望这样做会有所帮助。