若依管理系统——前后端分离版(二)登陆接口分析及SpringSecurity的登陆认证流程

一、登陆流程分析
0. 流程整理
1. 图片验证码接口/captchaImage
2.登陆验证接口/login
2.1 校验图片验证码
2.1 查询用户信息
2.3查询用户的权限信息
2.4 生成令牌token
3.登录
二、SpringSecurity的登陆认证流程分析
1. AuthenticationManager 认证管理器
2. ProviderManager
3. AbstractUserDetailsAuthenticationProvider 查询UserDetails信息
4. DaoAuthenticationProvider
5. UserDetailsService
6. AbstractUserDetailsAuthenticationProvider 进行认证
6.1 认证前校验
6.2 附加校验
6.3 认证后校验
三、在请求头中携带token信息请求后台接口
1. 获得请求头
2.获取请求头中的认证信息
3.解析jwt令牌,获取缓存中的用户信息
一、登陆流程分析
0. 流程整理


1. 图片验证码接口/captchaImage


在登陆之前会有一个请求图片验证码的接口/captchaImage,页面获得图片验证码,后台接口生成一个图片和UUID,并将验证码Code和UUID存入的到Redis缓存中。


2.登陆验证接口/login


2.1 校验图片验证码
参数包括:登录名、密码、验证码、唯一标识,进行登录验证。


2.1 查询用户信息
如果验证码验证成功,则开始检验用户信息:会去调用 UserDetailsServiceImpl的loadUserByUsername方法。进行用户认证流程,具体见下一节。


UserDetailsServiceImpl是我们实现了UserDetailsService接口:

返回一个UserDetails对象,包括用户对象和用户的权限信息。


LoginUser实现了UserDetails


2.3查询用户的权限信息

sys_menu是菜单权限表,关联了角色-菜单关联表、用户-角色关联表、角色表。
也就是根据用户Id通过用户表-角色关联表 查询 角色信息,在通过角色-菜单表 查询菜单信息。


2.4 生成令牌token

先通过工具类生成一个UUID,作为令牌的唯一标识。

refreshToken()方法以生成的UUID加前缀作为Key,将用户信息存到缓存中,并设置有效期。

使用createToken方法生成 JWT 令牌


流程总结:
查询用户信息,生成UUID,以UUID作为key,用户信息为Value 存入缓存,在将UUID信息存放到到JWT令牌中,将令牌返回给前端页面。
用户再次请求的时候将令牌放到请求头中,后台解析令牌,获得UUID,去缓存中回去用户信息。

3.登录
登录成功:


二、SpringSecurity的登陆认证流程分析


1. AuthenticationManager 认证管理器

根据用户输入的用户名、密码构建了 UsernamePasswordAuthenticationToken,并将其交给 AuthenticationManager 来进行认证处理。AuthenticationManager 本身不包含认证逻辑,其核心是用来管理所有的 AuthenticationProvider,通过交由合适的 AuthenticationProvider 来实现认证。

2. ProviderManager
下面跳转到了 ProviderManager ,该类是 AuthenticationManager 的实现类。


3. AbstractUserDetailsAuthenticationProvider 查询UserDetails信息
传统表单登录的 AuthenticationProvider 主要是由 AbstractUserDetailsAuthenticationProvider 来进行处理的,通过 retrieveUser() 方法读取到数据库中的用户信息,具体实现在 DaoAuthenticationProvider 中

4. DaoAuthenticationProvider

5. UserDetailsService
这里调用了UserDetailsService的loadUserByUsername方法,而我们的UserDetailsServiceImpl实现了UserDetailsService接口,重写了loadUserByUsername方法


6. AbstractUserDetailsAuthenticationProvider 进行认证
当我们成功的读取 UserDetails 后,下面开始对其进行认证。

6.1 认证前校验


6.2 附加校验


6.3 认证后校验


我们可以看到认证校验分为 前校验、附加校验和后校验,如果任何一个校验出错,就会抛出相应的异常。所有校验都通过后,调用 createSuccessAuthentication() 返回认证信息。


在 createSuccessAuthentication 方法中,我们发现它重新 new 了一个 UsernamePasswordAuthenticationToken,因为到这里认证已经通过了,所以将 authorities 注入进去,并设置 authenticated 为 true。
到此就已经认证完成了。

SpringSecurity认证流程文章参考:https://jitwxs.blog.csdn.net/article/details/84703690

三、在请求头中携带token信息请求后台接口
比如 登录后请求的/getInfo接口:

请求后台接口时,获取请求头中的认证信息:

Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE5ZWQ4MjYxLTRmOTgtNDY1Zi1iNTcwLTlkMmU2MGEyOWQzOCJ9.z0gvgUQPDQSiMAm5QfljsRSPGkJhuCvjlA--m_Jd7y87QICeb53Sj28yMLxNQwkoXqwsk3HKLnkX1OjA5goUdQ
1


1. 获得请求头
首先使用ServletUtils.getRequest()获取request信息,这个方法有调用的是getRequestAttributes()方法,


2.获取请求头中的认证信息
获得了request信息后,从请求头中获取token:


3.解析jwt令牌,获取缓存中的用户信息
解析token,获取唯一标识,根据唯一标识获得缓存中的用户信息:


由此就获得了用户的信息,在根据用户信息查询对应的角色和权限。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI周红伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值