如何使用来自Spring Security的新密码编码器

2022-08-31 17:19:11

从Spring Security 3.1.4.RELEASE开始,旧的已被弃用,取而代之的是.由于我的应用程序尚未向公众发布,我决定迁移到新的,未弃用的API。org.springframework.security.authentication.encoding.PasswordEncoderorg.springframework.security.crypto.password.PasswordEncoder

到目前为止,我有一个自动使用用户的注册日期作为每个用户的盐作为密码。ReflectionSaltSource

String encodedPassword = passwordEncoder.encodePassword(rawPassword, saltSource.getSalt(user));

在登录过程中,Spring还使用我的bean来适当地验证用户是否可以登录。我无法在新密码编码器中实现这一点,因为SHA-1的默认实现 - 只能在编码器创建期间添加全局秘密盐。StandardPasswordEncoder

有没有合理的方法可以使用未弃用的API进行设置?


答案 1

如果您实际上还没有使用现有格式注册任何用户,那么最好改用BCrypt密码编码器

这大大减少了麻烦,因为您根本不用担心盐 - 细节完全封装在编码器中。使用BCrypt比使用普通哈希算法更强大,它也是一种与使用其他语言的应用程序兼容的标准。

真的没有理由为新应用程序选择任何其他选项。


答案 2

这是BCrypt的实现,它对我有用。

在春季安全.xml

<authentication-manager >
    <authentication-provider ref="authProvider"></authentication-provider>  
    </authentication-manager>
<beans:bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <beans:property name="userDetailsService" ref="userDetailsServiceImpl" />
  <beans:property name="passwordEncoder" ref="encoder" />
</beans:bean>
<!-- For hashing and salting user passwords -->
    <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

在 java 类中

PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(yourpassword);

有关弹簧安全性的更多详细示例,请单击此处

希望这会有所帮助。

谢谢


推荐