SpringSecurity6 | 默认登录页

在这里插入图片描述
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Java从入门到精通
✨特色专栏: MySQL学习
🥭本文内容:SpringSecurity6 | 默认登录页
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说SpringSecurity6

image-20231030235443828

✨✨ 粉丝福利订阅✨✨

在这里插入图片描述
Leo哥收集了一些关于面试以及其他学习资源,这里分享给大家,各位卷王快收下吧!!!

1.前言

大家好,我是Leo哥🫣🫣🫣,前面我们学习了有关SpringSecurity在SpringBoot项目中是如何给我进行自动的添加鉴权功能,简单复习了一下SpirngBoot的自动配置。接下来我们就接着学习SpringSecurity相关知识点。这一节我们将要学习SpringSecurity中默认的登录页面是如何实现的。好了,话不多说让我们开始吧😎😎😎。

2.涉及过滤器

在在SpringSecurity6核心过滤器中,我们有介绍到当SpringBoot项目启动后,SpringSecurity一共有15个过滤器默认自启动。那么我们请求发出到渲染出默认登录页面这个过程又设计到几个过滤器呢,接下来我们简单介绍一下。

  • 首先是UsernamePasswordAuthenticationFilter,他主要根据用户名和密码进行认证的。

  • 然后就是DefaultLoginPageGeneratingFilter,它主要负责默认登录页面的生成。

  • ExceptionTranslationFilter,他主要负责SpringSecurity处理认证过程中发生的异常。

  • 最后就是AuthorizationFilter,主要是处理用户的访问认证处理,只有当访问认证通过了,该请求才会被通过。

3.登录页面渲染流程

我们要想知道一个请求是如何被SpringSecurity中一步一步拦截,并生成默认的登录页面的话,我们就必须知道当我们的请求经过SpringSecurity中如何被过滤器拦截,就要知道他的细节。下面我通过一张图来带大家了解,一个请求发出后,在SpringSecurity内部是如何运作的。

image-20231119220128982

页面渲染力流程:

  1. 访问地址 http://localhost:8500/hello,会经过过个过滤器进行过滤拦截。
  2. 当请求到达AuthorizationFilter时,系统会检查是否该请求是否进行了认证,如何未认证,则会将该请求拦截下来,并抛出AccessDenieException异常。
  3. 抛出的AccessDenieException异常会被ExceptionTranslationFilter破获并启动身份验证,在这个Filter中会调用LoginUrlAuthenticationEntrypoint的commence()方法,并要求重定向到/login页面中去。
  4. 重定向到/login页面,也就是客户端发送的/loginq请求。
  5. /login请求会被过滤器DefaultLoginPageGeneratingFilter进行拦截,并在过滤器中返回默认的登录页面。

4.重定向登录页

那么上面流程是这么说的,流程图是这么画的,如何验证我们的猜想呢,下面就跟着Leo哥视角,去写一个测试,通过源码追踪的方式去验证我们的猜想。

首先添加一个访问测试接口:

@GetMapping("/test")
public String test() {
    return "Hello SpringSecurity6";
}

未登录时访问接口,会 重定向到登录页,流程图如下说示:

image-20231119222738018

流程图说明:

  1. 一个用户向其未被授权的资源(/test)发出一个未经认证的请求。
  2. 请求进入SecurityFilterChain开始执行过滤器,在AuthorizationFilter中校验不通过,抛出一个AccessDeniedException
  3. ExceptionTranslationFilter 捕获到异常,调用LoginUrlAuthenticationEntryPoint 重定向到/login
  4. 重定向的/login发起请求进入过滤器
  5. /login会被DefaultLoginPageGeneratingFilter处理,直接响应写出默认登录页。

4.1 抛出 AccessDeniedException

访问上述接口地址,在SpringSecurity6核心过滤器中,有介绍请求最开始是到达FilterChainProxy,由它来调用SecurityFilterChain中的过滤器,/test是没有经过认证的,依次通过下述所有过滤器。

image-20231119222914647

在通过最后一个过滤器AuthorizationFilter中,对当前请求做最后的权限校验,如果没有权限,则会抛出AccessDeniedException

image-20231119222957823

首先AuthorizationFilter会取出当前用户认证信息,因为当前请求未认证,用户为AnonymousAuthenticationFilter创建的匿名用户

image-20231119223120045

接着使用AuthorizationManager授权管理器对当前认证信息检查,因为是匿名用户,所以判定当前请求无权访问,抛出AccessDeniedException

image-20231119223320474

4.2 异常处理

抛出的AccessDeniedException异常会被ExceptionTranslationFilter捕获:

image-20231119223453928

ExceptionTranslationFilter根据异常类型进行相应处理:

image-20231119223543539

接着调用handleAccessDeniedException

image-20231119223648856

接着调用sendStartAuthentication缓存请求,并调用AuthenticationEntryPoint生成认证入口:

image-20231119223625130

4.3 重定向

接着调用到LoginUrlAuthenticationEntryPoint的commence进行重定向或者转发

image-20231119223801209

4.4 生成默认登录页面

在经过DefaultLoginPageGeneratingFilter时,进行默认登录页处理,在该过滤器中,维护了很多参数:

	// 登录页地址,默认/login
    private String loginPageUrl;
    // 登出成功页地址,默认/login?logout
    private String logoutSuccessUrl;
    // 登录错误页地址,默认/login?error
    private String failureUrl;
    // 是否开启表单登录
    private boolean formLoginEnabled;
    // 是否开启oauth2登录
    private boolean oauth2LoginEnabled;
    // 是否开启saml2登录
    private boolean saml2LoginEnabled;
    // 认证请求地址,默认/login
    private String authenticationUrl;
    // 用户名参数,默认username
    private String usernameParameter;
    // 密码参数,默认password
    private String passwordParameter;

重定向的GET /login请求则会进入生成登录页逻辑,调用response直接输出一个页面,并return不再执行后续操作:

image-20231119223919693

那么这个LoginPageHtml是啥呢,其实大家到这里已经可以猜到了,没错就是我们的默认登录页面的HTML,被拼接成了String字符串,最后通过response写出。

我们可以点进去generateLoginPageHtml()这个方法中去查看。

image-20231119224144289

没错,就是我们熟悉的HTML,然后通过StringBuilder拼接然后返回。

最后,我们默认的登录页面就在前端浏览器进行了展示。

image-20231119224305949

5.参考文献

  • https://springdoc.cn/spring-security/servlet/architecture.html
  • http://springboot.fun/

6.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

ToLeoJavaer公众号 (微信搜索程序员Leo)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/165643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)

最近找个springboot脚手架重新熟悉一下springboot相关框架的东西,结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了,于是就给他再整一下看看如何解决 linux开放3306(可修改)端口直接访问 此方法较为方便&am…

基于一致性算法的微电网分布式控制MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 本模型主要是基于一致性理论的自适应虚拟阻抗、二次电压补偿以及二次频率补偿,实现功率均分,保证电压以及频率稳定性。 一致性算法 分布式一致性控制主要分为两类:协调同…

ZJU Beamer学习手册(二)

ZJU Beamer学习手册基于 Overleaf 的 ZJU Beamer模板 进行解读,本文则基于该模版进行进一步修改。 参考文献 首先在frame文件夹中增加reference.tex文件,文件内容如下。这段代码对参考文献的引用进行了预处理。 \usepackage[backendbiber]{biblatex} \…

学习网络编程No.10【深入学习HTTPS】

引言: 北京时间:2023/11/14/18:45,因为种种原因,上个月的文章昨天才更新,目前处于刷题前夕,算法课在看了。这次和以前不一样,因为以前对知识框架没有很好的理念,并不清楚相关知识要…

从一到无穷大 #19 TagTree,倒排索引入手是否是优化时序数据库查询的通用方案?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 文章主旨时序数据库查询的一般流程扫描维度聚合时间聚合管控语句 TagTree整体结构索引…

安装2023最新版PyCharm来开发Python应用程序

安装2023最新版PyCharm来开发Python应用程序 Install the Latest JetBrains PyCharm Community to Develop Python Applications Python 3.12.0最新版已经由其官网python.org发布,这也是2023年底的最新的版本。 0. PyCharm与Python 自从1991年2月20日&#xff0…

力扣刷题篇之位运算

系列文章目录 目录 系列文章目录 前言 一、位运算的基本运算 二、位运算的技巧 三、布隆过滤器 总结 前言 本系列是个人力扣刷题汇总,本文是数与位。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode&#xff0…

第7天:信息打点-资产泄漏amp;CMS识别amp;Git监控amp;SVNamp;DS_Storeamp;备份

第7天:信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份 知识点: 一、cms指纹识别获取方式 网上开源的程序,得到名字就可以搜索直接获取到源码。 cms在线识别: CMS识别:https://www.yun…

Android图片涂鸦,Kotlin(1)

Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…

JAVA多线程(5)

JAVA多线程(5) 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口…

度加创作工具 演示

度加创作工具 功能图功能测试文比润色测试经验分享测试测试输出测试输出工具地址功能图 功能测试 文比润色测试 经验分享测试 测试输出 在人工智能领域,我们一直在追求一个终极目标:让机器能够像人类一样,能够理解、学习和解决各种复杂问题。而要实现这个目标,我们需要将…

【Java 进阶篇】JQuery 事件绑定之事件切换:让页面动起来

欢迎来到这个充满动感的 JQuery 事件绑定之旅!在这篇博客中,我们将深入研究 JQuery 中的事件切换,让你的页面焕发出活力和互动。无论你是前端小白还是有一定经验的开发者,相信这篇文章都会对你有所帮助。 走进事件切换的奇妙世界…

python中Thread实现多线程任务

目录 多线程概括: 使用 Thread 模块创建线程 如果不使用多线程: 多线程概括: 多线程是一种并发执行的编程方式,允许程序同时执行多个独立的线程,每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

坐标系下的运动旋量转换

坐标系下的运动旋量转换 文章目录 坐标系下的运动旋量转换前言一、运动旋量物体运动旋量空间运动旋量 二、伴随变换矩阵三、坐标系下运动旋量的转换四、力旋量五、总结参考资料 前言 对于刚体而言,其角速度可以写为 ω ^ θ ˙ \hat {\omega} \dot \theta ω^θ˙&…

【2017年数据结构真题】

请设计一个算法,将给定的表达式树(二叉树)转换成等价的中缀表达式(通过括号反映次序),并输出。例如,当下列两棵表达式树作为算法的输入时: 输出的等价中缀表达式分别为(ab)(a(-d)) 和…

【Java 进阶篇】Ajax 入门:打开前端异步交互的大门

欢迎来到前端异步交互的世界!在这篇博客中,我们将深入探讨 Ajax(Asynchronous JavaScript and XML),这是一项能够让你的网页在不刷新的情况下与服务器进行数据交互的技术。无论你是刚刚踏入前端开发的小白,…

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰

说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…

Python---练习:封装一个函数,用于生成指定长度的验证码

练习涉及相关链接:Python---练习:编写一段Python代码,生成一个随机的4位验证码-CSDN博客 Python----函数中的说明文档-CSDN博客Python---return返回值-CSDN博客 代码: # 定义一个generate_code()函数 def generate_code(num): …

SDUT OJ《算法分析与设计》搜索算法

A - 子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中,S{ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得: 。 试设计一个解子…