我正在研究基于Spring MVC的传统Web应用程序,该应用程序正在使用 - 按当前标准 - 不适当的散列算法。现在我想逐渐将所有哈希迁移到bcrypt。我的高级策略是:
使用Spring Security实现此策略的最惯用方法是什么?我应该在AccessDecisionManager上使用自定义过滤器还是我??
答案 0 :(得分:5)
您可能需要自定义AuthenticationProvider
,因为密码实际上与用户数据进行了比较,并且您拥有所需的所有信息。
在authenticate
方法中,您首先要加载用户数据。然后使用BCryptPasswordEncoder
和旧版密码检查用户提供的密码。如果两者都没有返回匹配项,则抛出BadCredentialsException
。
如果用户成功验证(非常重要:-))并且密码是传统格式(传统编码器匹配),您将调用一些额外的代码来更新用户的帐户数据并用bcrypt替换旧的哈希值。 BCryptPasswordEncoder
也可用于创建新的哈希值。
如果需要,您可以在进行比较之前预先检测存储的哈希是否已经是bcrypt。 Bcrypt字符串具有完全不同的格式。
另请注意,为了使猜测有效的帐户名称变得更加困难,您应该尝试使方法在提供的用户名存在时和不存在的用户名时都表现相同(就时间而言)。因此,即使您没有所提供用户名的任何用户数据,也请调用编码器。
答案 1 :(得分:0)
我认为最好的方法是在身份验证提供程序中指定密码编码器,如下所示,有关详细信息,请参阅doc
<authentication-manager>
<authentication-provider user-service-ref="userService">
<password-encoder ref="passwordEncoder">
<salt-source ref="saltSource" />
</password-encoder>
</authentication-provider>
</authentication-manager>
<beans:bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"
id="passwordEncoder" />
<beans:bean class="org.springframework.security.authentication.dao.ReflectionSaltSource"
id="saltSource">
<beans:property name="userPropertyToUse" value="userName" />
</beans:bean>