先说结论
在继承AuthorizingRealm类的方法中添加代码,初始化 HasedCrendentialsMatcher 对象,替换当前 Realm 的 crendentialsMatcher 属性;
例如:
public class ShiroRealm extends AuthorizingRealm {
{
HashedCredentialsMatcher mather = new HashedCredentialsMatcher();
// 加密方式
mather.setHashAlgorithmName("md5");
// 密码进行两次运算
mather.setHashIterations(2);
this.setCredentialsMatcher(mather);
}
/**
*
* 获取用户权限,角色信息进行配置
*
* **/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
log.info("用户角色,权限开始分配");
...
return authorizationInfo;
}
/**
*
* 进行常规的信息验证
*
* **/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
log.info("用户认证开始");
...
SimpleAuthenticationInfo
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), credentialsSalt, getName());
return authenticationInfo;
}
}
再次登录的时候,shiro会按照上述的加密方式去加密,然后与SimpleAuthenticationInfo提供的密码(数据库存储的用码)比对。
再说过程
Realm 的 crendentialsMatcher 属性是配置密码匹配的方式,如果没有配置 credentialsMatcher 则默认使用 SimpleCredentialsMatcher 类,实现 CredentialsMatcher 接口,SimpleCredentialsMatcher 类不会对密码进行任何处理直接进行比对。
image.pngHashedCredentialsMatcher 类继承SimpleCredentialsMatcher 类,对密码加盐加密处理重写了doCredentialsMatch()方法(大概截图,具体查看源码)。所以我们需要初始化 HasedCrendentialsMatcher 对象,替换当前 Realm 的 crendentialsMatcher 属性。
image.png
网友评论