三。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中获取密码。