Configuration 用于自定义用户详细信息的Spring安全性

Configuration 用于自定义用户详细信息的Spring安全性,configuration,spring-security,salt,details,Configuration,Spring Security,Salt,Details,我想加盐,比如: PasswordEncoder encoder = new ShaPasswordEncoder(); userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails)); 由于userDetails是我定制的userDetails类的实例,我不得不将其转换为这个spring类: ,但正如逻辑预期的那样,我在运行时得到

我想加盐,比如:

PasswordEncoder encoder = new ShaPasswordEncoder();
        userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));
由于
userDetails
是我定制的
userDetails
类的实例,我不得不将其转换为这个spring类: ,但正如逻辑预期的那样,我在运行时得到:

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

ReflectionSaltSource
仅适用于
UserDetails
对象(我假设这就是类强制转换异常的原因?),因此,您必须要么实现
UserDetails
,要么创建自己的
SaltSource
实现,该实现与您的对象一起工作

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


请注意,SpringSecurity3.1“crypto”包中实际上有一个新接口(在
org.springframework.Security.crypto.password
中)。这不包括中的salt,因为它假定salt是内部生成的(与BCrypt实现一样)。框架通常会接受其中一个或遗留的
org.springframework.security.authentication.encoding.PasswordEncoder

模型。UserDetails
类必须实现接口
org.springframework.security.core.UserDetails.UserDetails
-它不需要是class
org.springframework.security.core.userdetails.User


您还可以查看如何为密码的编码和解码设置
ReflectionSaltSource
,或者帮助您了解Luke关于
BCryptPasswordEncoder
的精彩提示。我在这里写了一篇关于这些细节的博客文章:
Luke写了代码,所以他当然知道他在说什么,但我看到很多人,包括我自己,都很难找到这些信息,希望like会有所帮助

@Luke,据我从你的链接帖子中了解,
BCrypt
已经包含Salt。在这种情况下,我如何配置Salt?当使用
BCrypt
时,它是可配置的吗?上面说:“这会自动生成一个salt,并将它与散列值连接在一个字符串中”@sergionni:注意Spring Security中的API更改!在3.0.x中,使用salt对密码进行编码。但是在3.1.x中,不使用盐。卢克的建议只适用于3.1.x版本。@Roadrunner,我的版本是3.0.0.RC1。谢谢你的提示。@sergionni:为什么是RC1?发布版本已经有好几个月了。你应该认真考虑最新的3。x版本:@ Roadrunner,我还有一个问题。我在我的POM文件中指定了3.1.0版本。默认情况下使用以下构造生成salt:
userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),null))
我之前看过你的帖子。据我所知,其中的类
CustomUserDetails
实现了spring的
UserDetails
,不是吗?情况就是这样,我现在不需要实现它。我的自定义
UserDetails
非常小,这就足够了。@sergionni:这只是一个示例占位符-你可以使用
org.springframework.security.core.UserDetails.UserDetails
的任何实现来代替“CustomUserDetails”-它可能是你自己的,要么很小,要么很有特色,或者是框架
org.springframework.security.core.userdetails.User
提供的。我文章的主要部分是关于配置
SaltSource