问题:
因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);
}