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
-它不需要是classorg.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
。