You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:39:03