问题: shiro到底是如何认证的呢,原理是啥呢?
1、在登录页面开始登录 输入用户名和密码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/721d7fe4259a147c25fd5310fa22507b.png)
2、后台接收到了登录请求,执行以下代码,然后开始认证
登录的过程将用户名和密码传入UsernamePasswordToken中
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/62d88574b44489faa358b1bfb5897a20.png)
3、 然后进入DelegatingSubject的login方法
在这里所有安全操作都会委托给SecurityManager来执行
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/21ae826e0b79fa0c00396adf7a039832.png)
4、 开始进行认证方法
这个info就是UserRealm的doGetAuthenticationInfo
方法(用于认证)返回的info
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/63ea431134b558efd12b5a928d42a269.png)
5、经过一系列的挑战,进入以下方法
这里才是真正的具体实现方法
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ea93880bacb2fda2b5ea5bd74447c929.png)
6、然后进入doSingleRealmAuthentication方法,然后判断UserRealm是否支持token
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a12bef43aab68518443366c2824f9273.png)
7、下面就是重中之重,开始完成一系列的认证和密码匹配过程
我们这时候找到自定义Realm,UserRealm是shiro和数据认证和授权的桥梁,可以通过此类从数据库中获取用户信息和权限。
(1)、先从缓存中获取info
(2)、如果获取不到,就从UserRealm的doGetAuthenticationInfo方法中获取,在此方法中将数据库的加密后的用户密码获取,封装到info中并返回
(3)、对密码进行匹配,在ShiroConfig中配置了凭证匹配器,通过此配置对token中的密码进行加密,然后和封装在info中的密码(从数据库中获取的加密密码)进行匹配,如果成功就说明整个认证过程成功,失败就报错
(4)、登陆认证成功后,将info存入缓存中。同时将用户信息存入session中,这个session不是放在Tomcat中的session,而是属于shiro自己的session,shiro用DefaultWebSessionManager
调用start()创建SimpleSession
,并将SimpleSession
放在redis中,并向前端返回一个sessionId。下次前端访问其他接口的时候,拦截器就会拦截此请求,就会判断SimpleSession
是否存在该用户信息,如果存在就说明已经登录,不存在就拒绝访问。同时也可以通过Subject.isAuthenticated()
判断是否登录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dcb5b7707173165ef47523deaddae688.png)