侧边栏壁纸
  • 累计撰写 72 篇文章
  • 累计创建 31 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

Shiro学习-密码的比对及密码的MD5加密(八)-Peak-Gao

PeakGao
2024-11-27 / 0 评论 / 0 点赞 / 1 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材可能会来自网络,若不小心影响到您的利益,请联系我们删除。

密码比对

通过AuthenticatingRealm的credentialsMatcher进行密码的比对
由于你获取数据是从数据库获取的是加密后的密码,所以挺重要的

密码加密

如何把一个字符串加密为MD5
替换当前Realm的CredentialsMatcher属性,可以使用Md5CredentialsMatcher但是推荐使用HashedCredentialsMatcher对象,并设置加密算法

加密的流程

1.为什么使用MD5盐值加密:
2.如何做到:

2.1在doGetAuthenticationInfo方法返回值创建SimpleAuthenticationInfo对象的时候,需要使用SimpleAuthenticationInfo(principal,credentials, credentialSalt,realmName);构造器
2.2 ByteSource.Util.bytes(username); 
2.3盐值需要唯一:一般采用随机字符串和userId
2.4使用new SimpleHash(hashAlgorithmName,credentials,salt,hashIterations)来计算盐值加密后的密码的值
public class ShiroRealm extends AuthenticatingRealm {

//认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //1.将AuthenticationToken转换为UsernamePasswordToken
        UsernamePasswordToken uptoken = (UsernamePasswordToken) token
        //2.从UsernamePasswordToken获取username
        String username = uptoken.getUsername()
        //3.调用数据库的方法,从数据库中查询username 对应的用户记录
        System.out.println("从数据库中获取该用户名对应的记录")
        //4.若用户不存在,则抛出异常UnknownAccountException
        if(username.equals("qweqw")){
            throw new UnknownAccountException("用户不存在")
        }
        //5.根据用户信息的情况,决定是否抛出其他异常
        if(username.equals("123")){
            throw new LockedAccountException("用户被锁定")
        }
        //6.根据用户的情况,来构建AuthenticationInfo对象并返回,通常使用的实现类为SimpleAuthenticationInfo
        //以下信息是从数据库中获取的
        //1.principal:认证的实体信息,可以是username,也可以是数据表对应的用户的实体类对象
        Object principal = username
        //2.credentials:密码
        Object credentials = null
        if("admin".equals(username)){
            credentials = ""  
        }else if("user".equals(username)){
            credentials = ""
        }
        //3.realmName:当前realm对象的name调用父类的getName()方法即可
        String  realmName = getName()
        //4.盐值
        ByteSource credentialSalt= ByteSource.Util.bytes(username) 
        //加密一般使用的是随机字符串或userId

        SimpleAuthenticationInfo info = null
        info =   new SimpleAuthenticationInfo(principal,credentials, credentialSalt,realmName)
        return info
    }
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区