一、登陆流程分析
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,获取唯一标识,根据唯一标识获得缓存中的用户信息:

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

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

  1. 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出

    场景 使用若依前后端分离版实现Excel的导入和导出. 前端:Vue+ElementUI 后端:SpringBoot+POI+Mysql 注: 博客: https://blog.csdn.net/ba ...

  2. 从零入门开源框架---若依(前后端分离版)

    一.若依是什么? 若依它就是一个开源项目,别人写好的代码,我们拿来进行二次开发,它主要是做数据和权限管理系统. 二.使用背景 任何公司的各种大的项目必然需要一个后台权限管理系统,这是必然的,但是如果不 ...

  3. Vue+SpringBoot图书管理系统前后端分离(教你一步一步搭建)

    Vue+SpringBoot图书管理系统前后端分离(教你一步一步搭建) 介绍: 说明: 环境搭建 后端环境搭建 1.新建一个工程(只有收费版的idea才有这个选项哦) 2.选择Java8 4.配置工程 ...

  4. 基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis)

    基于javaweb的进销存管理系统(前后端分离+java+vue+springboot+ssm+mysql+redis) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后 ...

  5. 若依权限系统分析(前后端分离版)

    若依权限系统分析 一:故事背景 二:具体权限控制 2.1 页面权限控制 2.2 页面元素权限控制 三:实现前端鉴权 3.1 封装js与权限交互 3.1.1 uni-app自带uni-request与权 ...

  6. springboot flask php,使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发(二)

    使用Vue完成前后端分离开发(二) Bravery never goes out of fashion. 勇敢永远不过时. 前面简单说了一下 Vue 项目的搭建和项目的大致页面,这里讲一下 Djang ...

  7. 若依前后端分离版怎样去掉登录验证码

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依前后端分离版本的配置 上面在 ...

  8. 若依前后端分离版手把手教你本地搭建环境并运行项目

    场景 RuoYi-Vue是一款基于SpringBoot+Vue的前后端分离极速后台开发框架. RuoYi 官网地址:http://ruoyi.vip RuoYi 在线文档:http://doc.ruo ...

  9. 若依前后端分离版数据库已经存在的字典添加一条后刷新没作用,必须清除Redis缓存

    场景 使用若依的前后端分离版,前端下拉框的使用直接查询的是字典表中的数据. 对于某个类型的字典如果之前已经添加过并使用过,后来想要再添加一条此类型的字典. 在数据库中添加后,前端刷新下,发现没有获取到 ...

最新文章

  1. 浅谈Android五大布局——LinearLayout、FrameLayout和AbsoulteLa
  2. rhel 6.4 + udev + 11.2.0.3 + asm 单点安装
  3. 【android-tips】关于string.xml的使用
  4. STM32的SPI时钟
  5. 从 Java 小白到收获 BAT offer ,分享我这 2 年的经验
  6. dnf 跨服 服务器 位置,dnf2017跨区表_2017dnf90级版本跨区表_快吧游戏
  7. sql根据类别拆分上下级_运用SQL对黑五销售数据进行分析
  8. 40. 组合总和 II021(回溯法)
  9. Mac乐谱制作工具---Sibelius 8 for Mac西贝柳斯
  10. Acer 4750 安装黑苹果_黑苹果系统安装教程之驱动篇
  11. IP数据报首部的格式identification
  12. python并行编程 - 介绍篇
  13. 支付系统设计包含:账户,对账,风控...
  14. ARP Cache Poisoning Attack Lab(SEED实验)
  15. 【quartus】packed unpacked array
  16. 中国英语市场营销分析与竞争形势调研报告2022版
  17. python爬取url_python爬虫之爬取谷歌url
  18. 笔记-uni-app入门到实战 以项目为导向 掌握完整开发流程
  19. Python中使用逻辑与运算符“and”判断两个比较条件是否满足时编辑器提示“Simplify chained comparison ”的解决方法
  20. 共享开源技术,共建开放生态丨平凯星辰余梦杰出席 2022 世界互联网大会开源论坛圆桌对话

热门文章

  1. java私塾 设计模式 视频_[章节]Java Web开发理论部分视频教程 之 04 mvc设计模式详解视频教程 - 我的学习中心 - 私塾在线 - 只做精品视频课程服务...
  2. 文本编辑器中实现设置工具栏和状态栏可见性的功能
  3. mysql查询特定时间数据视频_mysql查询特定时间段内的数据
  4. delphi 调用php接口_新浪图床 API 接口调用与请求方法详细教程
  5. Andriod:安卓线程实现页面的自动跳转
  6. keras 模型量化
  7. sql 字符串函数(一)
  8. 新疆计算机英语网考,2019年新疆远程教育入学考试考英语计算机技术和数学科目吗...
  9. 49. Leetcode 117. 填充每个节点的下一个右侧节点指针 II (二叉树-二叉树遍历)
  10. 报错处理:sh: 1: Syntax error: “(“ unexpected