流程图

 登录流程:

前端提交用户名和密码到后端接口方法中,被 spring security 拦截,需要进行用户认证,首先将用户名和密码通过

AuthenticationManager 接口中的 authenticate 方法封装成一个 Authentication 对象 

但是Authentication是一个接口,要用Authentication 的实现类 UsernamePasswordAuthenticationToken 传入用户名和密码参数封装成 Authentication 对象。

然后调用LoadUsername方法取查询用户,因为默认查询的是缓存当中的用户对象,因为我们要去数据库中查询,所以要自己实现 UserDetails 接口重写LoadUsername方法查询用户对象,根据用户名查询对象,如果对象为空,return null,如果查询到对象数据,先将前端传过来的密码进行加密,再与当前用户对象的密码进行比对,默认的加密方式BCryptPasswordEncoder)

认证成功后,将用户对象和权限信息集合一起封装到自己创建的 LoginUser 中(要实现UserDetails 接口)返回回去

通过当前用户去查询数据库 权限关系表 用户表(id) ---角色表 ----菜单表

 最后将用户对象 变成 jwt 加密 , 将Token  顺便 放到 redis 中, 返回给前端的UUID 

过滤器流程:

1.     判断 请求头上有没有token 的uuid

没有 ----return

有 ----通过 token 的uuid 去查看 redis 中的token

2.     Token 进行解析,获取body 那部分信息

3.     Session 的数据共享-----将用户对象信息 放到 spring security 的一个本地线程当中SecurityContextHolder

整体思路:

用户输入用户名密码点击登录,前端将请求发送到后端的请求接口,首先被过滤器拦截,判断请求头上有没有携带token的uuid,如果没有,抛出异常,如果有,通过uuid来获取token,然后对token’进行解析,获取body的信息,为了实现后续所有请求的数据共享,将当前用户信息存储到pring security 的一个本地线程当中SecurityContextHolder中

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐