zoukankan      html  css  js  c++  java
  • 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()方法,如果匹配失败,就抛出密码错误的异常。

  • 相关阅读:
    Linux kernel device mapper
    草莓网
    openwrt系统源码地址
    ubuntu 安装eclipse for c++
    ubuntu下安装eclipse IDE for C/C++ developers
    Makefile 中:= ?= += =的区别
    core dump
    rtp
    skbuff
    A Neural Algorithm of Artistic Style
  • 原文地址:https://www.cnblogs.com/step-and-step/p/13324067.html
Copyright © 2011-2022 走看看