Shiro 修改认证时的密码比对

2018-09-21  本文已影响0人  LOok_阳阳

先说结论

在继承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.png

HashedCredentialsMatcher 类继承SimpleCredentialsMatcher 类,对密码加盐加密处理重写了doCredentialsMatch()方法(大概截图,具体查看源码)。所以我们需要初始化 HasedCrendentialsMatcher 对象,替换当前 Realm 的 crendentialsMatcher 属性。

image.png
上一篇下一篇

猜你喜欢

热点阅读