记一次shiro升级版本,1.3.0——>1.10.0,登录失败的问题

问题:

因shiro低版本出现漏洞,所以需要把1.3.0版本升到1.10.0版本,但是升级完版本后发现登录不上,用户名或密码错误。

原因:

发现是不同版本的源码还是有所区别的。

1.3.0版本的

    protected DataSource dataSource;
    protected boolean permissionsLookupEnabled = false;
    protected JdbcRealm.SaltStyle saltStyle;

info = new SimpleAuthenticationInfo(username, password.toCharArray(), this.getName());
    if (salt != null) {
        info.setCredentialsSalt(Util.bytes(salt));
    }

1.10.0版本的

    protected DataSource dataSource;
    protected boolean permissionsLookupEnabled = false;
    protected SaltStyle saltStyle = SaltStyle.NO_SALT;
    protected boolean saltIsBase64Encoded = true;

info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());
            
    if (salt != null) {
        if (saltStyle == SaltStyle.COLUMN && saltIsBase64Encoded) {
            info.setCredentialsSalt(ByteSource.Util.bytes(Base64.decode(salt)));
        } else {
            info.setCredentialsSalt(ByteSource.Util.bytes(salt));
        }
    }

关键在于JdbcRealm这个类上,生成的盐不同,导致密码加密结果不同,从而密码对不上。

1.10.0版本多了saltIsBase64Encoded这个编码判断,默认为true,所以,他会默认给盐base64编码一次,而1.3.0版本并没有这个判断,所以会导致盐不同,使得密码不同。

解决方案:

直接简单粗暴把saltIsBase64Encoded这个值赋为false,使得适配1.3.0的密码。

    @Autowired
    private JdbcRealm jdbcRealm;

    @PostConstruct
    public void setSaltIsBase64Encoded() {
        jdbcRealm.setSaltIsBase64Encoded(false);
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值