shiro配置加密的两种方式,这里以MD5算法作为演示。
1.重写自实现的Realm类的setCredentialsMatcher()方法
public class MyRealm extends AuthorizingRealm {
...
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// 设置加密算法
hashedCredentialsMatcher.setHashAlgorithmName("MD5");
// 设置加密次数
hashedCredentialsMatcher.setHashIterations(1024);
super.setCredentialsMatcher(hashedCredentialsMatcher);
}
}
2.在shiroConfig配置类中
/**
* 创建Realm,注入加密
*/
@Bean(name = "myRealm")
public MyRealm getRealm(@Qualifier("credentialsMatcher") HashedCredentialsMatcher credentialsMatcher) {
MyRealm myRealm = new MyRealm();
myRealm.setCredentialsMatcher(credentialsMatcher);
return myRealm;
}
/**
* 设置加密
*/
@Bean(name = "credentialsMatcher")
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// 设置加密算法
hashedCredentialsMatcher.setHashAlgorithmName("MD5");
// 设置加密次数
hashedCredentialsMatcher.setHashIterations(1024);
return hashedCredentialsMatcher;
}
注意:在认证方法中要做对应的修改,即
public class MyRealm extends AuthorizingRealm {
@Autowired
IUserService userService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
User user = userService.queryUserByName(token.getUsername());
// 判断用户名
if (user == null) {
return null;
}
// 判断密码
// return new SimpleAuthenticationInfo(user, token.getPassword(), getName());
return new SimpleAuthenticationInfo(user,new SimpleHash("MD5", token.getPassword(), token.getUsername(), 1024),
ByteSource.Util.bytes(user.getName()), getName());
}
......
}
否则验证时原密码比对库中的加密后的密码,会java.lang.IllegalArgumentException: Odd number of characters