Grails和Spring安全性:与加密模块PasswordEncoder一起使用时,Salt值必须为Null

Grails和Spring安全性:与加密模块PasswordEncoder一起使用时,Salt值必须为Null,grails,spring-security,Grails,Spring Security,我几乎完成了Grails2.2.1到2.3.4的升级,以及Spring安全插件1.2.7.3到2.0 RC2的升级。我的应用程序正在运行,但当我尝试登录时,我得到一个: java.lang.IllegalArgumentException: Salt value must be null when used with crypto module PasswordEncoder 我还没有弄明白这一点,也没有找到任何与grails或spring安全插件相关的错误提示 我使用自定义UserDetai

我几乎完成了Grails2.2.1到2.3.4的升级,以及Spring安全插件1.2.7.3到2.0 RC2的升级。我的应用程序正在运行,但当我尝试登录时,我得到一个:

java.lang.IllegalArgumentException: Salt value must be null when used with crypto module PasswordEncoder
我还没有弄明白这一点,也没有找到任何与grails或spring安全插件相关的错误提示

我使用自定义UserDetails服务设置了salts,如本文所述:

我不知道我是否需要以不同的方式来做这些工作(如果新插件有更好的方法来做),或者我只是需要改变一些小的东西(比如我必须通过升级过程将grails.plugins.springsecurity更改为grails.plugin.springsecurity)

log4j输出(尝试验证):


2.0中的默认算法是bcrypt,它不支持提供的salt,因为它在内部使用自己的salt。因此,取消配置任何与salt相关的设置(例如
dao.reflectionSaltSourceProperty
属性或自定义
saltSource
bean)并使用默认设置,或使用
password.algorithm
属性(例如,使用SHA-256)覆盖默认设置并配置salt设置。

Ok,我选择将SH-256与我现有的自定义用户详细信息一起使用(至少目前如此)。我在config.groovy中添加了password.algorithm以使用SHA-256。我不再收到错误消息,但没有任何用户正在进行身份验证…我启用了log4j调试日志记录,如果我尝试使用密码哈希(SHA-256和salt)对用户进行身份验证,则输出会在过滤器3(我用输出更新了问题)后显示失败。如果我尝试与salt列中有null的用户进行身份验证,我会得到相同的日志输出,如果密码是用1.2.x散列的,您可能需要将
grails.plugin.springsecurity.password.hash.iterations=1
添加到Config.groovy,因为新的默认值是10000。就是这样!非常感谢伯特
    web.FilterChainProxy  - /j_spring_security_check at position 3 of 8 in additional filter chain; firing Filter: 'RequestHolderAuthenticationFilter'authentication.ProviderManager  - Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider
    dao.DaoAuthenticationProvider  - Authentication failed: password does not match stored value
    rememberme.TokenBasedRememberMeServices  - Interactive login attempt was unsuccessful.
    rememberme.TokenBasedRememberMeServices  - Cancelling cookie