-
用户登录
- 成功
- 响应用户凭证(token、uuid、...)
- 响应用户菜单按钮权限(给前端用来判断菜单、按钮是否隐藏)
- 缓存用户凭证、用户信息(名字、权限集合、所属部门...)到 redis
- 成功
-
访问资源
- 用户携带凭证访问后台系统接口
- 凭证可以放在 请求头、表单、cookie...
- 用户携带凭证访问后台系统接口
-
认证鉴权过滤
-
请求到达后台,被拦截器拦截(拦截所有请求)
-
从 request 获取请求 uri、请求 method
-
判断该 uri 是否被忽略认证鉴权(不需要登录、也不需要权限的路径,这些路径开发自己配,可以放在 常量类、数据库、配置文件...)
-
忽略,则过滤器直接放行,让请求到达目标接口
-
不忽略(即需要认证鉴权)
-
获取用户凭证,解密得到用户id,判断是否存在redis中,如果要做登录互斥,这里去 redis 中匹配登录时存的凭证,匹配失败即说明当前登录态失效,即账户在其他地方登录
- 取不到凭证、凭证解析失败、解析出的id在redis没有相关缓存信息,都是异常情况,响应客户 请登录后访问
-
是否仅需要登录(配置原理同上)
- 是 -> 到第4步
- 否 -> 到第3步
-
需要鉴权
- 从 redis 中获取用户权限集合,循环与当前 uri、method 匹配
- 匹配成功 -> 拥有权限,到第4步
- 匹配失败 -> 响应没有权限
- 从 redis 中获取用户权限集合,循环与当前 uri、method 匹配
-
try finally 包围
- try 中
- 取出redis中的用户信息,放入 ThreadLocal,方便业务代码获取当前用户信息
- 放行请求 doFilter
- finally 中
- 清空当前 ThreadLocal
- try 中
-
-
-
-