Grails升级Shiro 1.7.1后旧用户认证报Invalid salt version错误如何解决
解决方案
你的推测完全正确,问题根因是新版Grails Shiro插件默认将凭证匹配器切换为BCrypt加密,旧版本生成的SHA-256格式密码哈希不符合BCrypt的格式规范,校验时就会抛出Invalid salt version异常。
你只需要将凭证匹配器切换回与旧版本一致的SHA-256配置即可,操作步骤如下:
- 第一步:在Grails项目的
grails-app/conf/spring/resources.groovy中配置自定义的HashedCredentialsMatcher Bean,覆盖默认的BCrypt匹配器
import org.apache.shiro.authc.credential.HashedCredentialsMatcher beans = { credentialsMatcher(HashedCredentialsMatcher) { // 指定与旧版本一致的哈希算法 hashAlgorithmName = "SHA-256" // 替换为旧版本实际使用的哈希迭代次数,未自定义过的话默认值为1 hashIterations = 1 // 旧版本存十六进制哈希则设为true,存Base64哈希则设为false storedCredentialsHexEncoded = true } }
- 第二步:检查你的自定义Realm代码,确保
doGetAuthenticationInfo方法返回的认证信息携带了正确的用户盐值,示例如下:
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal() User user = User.findByUsername(username) if (!user) { throw new UnknownAccountException() } // 第二个参数是数据库存储的加密密码,第三个参数是用户独有的盐值,第四个参数是Realm名称 return new SimpleAuthenticationInfo( username, user.password, ByteSource.Util.bytes(user.salt), getName() ) }
可选平滑升级方案
如果后续需要切换到更安全的BCrypt加密,可以加兼容逻辑:用户登录认证成功时,用BCrypt重新加密用户输入的明文密码,覆盖数据库中旧的SHA-256哈希值,逐步完成存量用户的加密方式迁移。
内容的提问来源于stack exchange,提问作者John Moore
相关产品推荐
相关产品推荐

