用于自定义UserDetails的Spring Security salt

时间:2011-12-28 16:32:39

标签: configuration spring-security salt details

我想加盐:

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

3 个答案:

答案 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 卢克写了代码,所以他肯定知道他在说什么,但我看到很多人,包括我自己很难弄清楚这些信息,希望这样做会有所帮助。