• shiro源码分析-凭证匹配器(密码匹配器)源码分析


    三。shiro的凭证匹配器(密码匹配器)源码分析

    这个是CredentialsMatcher接口的所有实现。实现类中都要实现doCredentialsMatch(token,info)方法。红色标记的都是散列算法,有MD5,SHA-512,SHA-256等等。

     1.AllowAllCredentialsMatcher。这个类比较奇葩,你传什么都会验证通过。后续shiro可能会继续扩展。

     2.PasswordMatcher。这个类要配合PasswordService这个接口使用。实际上就是自己在PasswordService的实现类中添加匹配逻辑。加密算法可以自己开发。

    3.SimpleCredentialsMatcher。SimpleCredentialsMatcher继承CodecSupport。CodecSupport这个类,实际是个工具类,它提供了字节数组,字符数组,字符串相互转换的方法。还包括文件File,输入流InputStream,对象Object转字节数组的方法。

    3.1.继续看SimpleCredentialsMatcher的doCredentialsMatch()方法。这里从token和info里面拿到密码信息后,就调用equals()方法。

    3.2.equals()方法里面。如果密码都是字符串就直接调用字符串的equals()方法。否则就全部转成字节数组,然后比较字节数组是否一样。

    4.HashedCredentialsMatcher。这个类提供散列算法。密码可以加盐。这个类继承SimpleCredentialsMatcher。查看该类的doCredentialsMatch()方法。是重写了父类的方法。 可以看到,最后还是调用SimpleCredentialsMatcher的equals()方法。

    4.1 hashProvidedCredentials(token, info)这个方法里面的逻辑,是从token中拿到前台传来的密码,然后从info中拿到盐和加密次数,构造SimpleHash对象。

    token.getCredentials()这个方法,就是从前台参数的token中获取密码。

     

    4.2 getCredentials(info)这个方法里面的逻辑,从info中获取密码,也就是数据库中存的密码,构造hash对象,这里的hash对象也是SimpleHash对象。

    4.3上面两个方面都返回SimpleHash对象。因为SimpleHash实现了Hash接口,Hash接口又继承了ByteSource接口。equals()中,这两个SimpleHash会转成字节数组。最后调用MessageDigest.isEqual(tokenBytes, accountBytes)方法,比较字符数组是否相等。

     我们继续跟踪shiro在认证的过程中,看什么地方调用密码匹配器。

     在AuthenticatingRealm类中查看getAuthenticationInfo(token)方法,此时已经拿到info信息,info里面就有从数据库中获取的密码和盐

     继续查看assertCredentialsMatch(token,info)方法。方法里面就调用了密码匹配器的doCredentialsMatch()方法,如果匹配失败,就抛出密码错误的异常。

  • 相关阅读:
    Sizzle引擎原理与实践(四)
    Sizzle引擎原理与实践(一)
    Sizzle引擎原生getElementsByClassName对选择结果的影响(jQuery)
    【翻译】HTML5开发——轻量级Web Database存储库html5sql.js
    【翻译】向后兼容的DOM事件绑定
    软件工程实践2019第二次作业
    软件工程实践2019第一次作业
    软件工程实践2019第四次作业
    发表文章
    Web设计
  • 原文地址:https://www.cnblogs.com/step-and-step/p/13324067.html
Copyright © 2020-2023  润新知