1.登录流程
controller
先验证验证码
然后验证用户是否有效
然后验证用户名和密码,通过的话会生成token
生成token
生成token之后存到返回结果中返回给前端 key为”token”,然后设置redis缓存过期时间,这个时间是token过期时间的2倍,用作续期token使用。具体方法在ShiroRealm这个类中。
JWTToken刷新生命周期 (实现: 用户在线操作不掉线功能)
- 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样),缓存有效期设置为Jwt有效时间的2倍
- 2、当该用户再次请求时,通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证
- 3、当该用户这次请求jwt生成的token值已经超时,但该token对应cache中的k还是存在,则表示该用户一直在操作只是JWT的token失效了,程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值,该缓存生命周期重新计算
- 4、当该用户这次请求jwt在生成的token值已经超时,并在cache中不存在对应的k,则表示该用户账户空闲超时,返回用户信息已失效,请重新登录。
- 注意: 前端请求Header中设置Authorization保持不变,校验有效性以缓存中的token为准。
- 用户过期时间 = Jwt有效时间 * 2。
Jwtutil的sign方法就是根据用户名生成token
2.token续期流程
请求进来会进行登录认证
从token中获取用户信息,如果获取到了,且用户状态正常,就判断token是否过期了。
如果过期了就续期。
- 过期的话重新生成token,重新设置过期时间,这时前端传的token也不需要变,只改redis缓存内容即可,因为是根据token获取用户信息来验证,登录的用户没有变的话,从token中获取的信息也是相同的,即使token的部分内容不同。这样过期的时候 就又有了一个小时的有效时间 redis是两个小时。
3.shiro权限认证
1.ShiroConfig类
1.shiroFilter方法
2.securityManager
3.缓存相关的
2.ShiroRealm类
具体执行拦截的类
1.support
应该是重新定义的token,需要重写此方法吧。(盲猜)
2.doGetAuthenticationInfo
3.checkUserTokenIsEffect
4.jwtTokenRefresh
5.doGetAuthorizationInfo
3.JwtToken类
实现了shiro的AuthenticationToken接口。
4.JwtFilter类
拦截的源头,请求进来会先到这里,然后交给ShiroRealm处理