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()方法,如果匹配失败,就抛出密码错误的异常。
posted on 2020-07-16 17:58 ajax取个名字真难 阅读(462) 评论(0) 编辑 收藏 举报