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时,进行默认登录页处理,在该过滤器中,维护了很多参数:

	// 登录页地址,默认/loginprivate String loginPageUrl;// 登出成功页地址,默认/login?logoutprivate String logoutSuccessUrl;// 登录错误页地址,默认/login?errorprivate String failureUrl;// 是否开启表单登录private boolean formLoginEnabled;// 是否开启oauth2登录private boolean oauth2LoginEnabled;// 是否开启saml2登录private boolean saml2LoginEnabled;// 认证请求地址,默认/loginprivate String authenticationUrl;// 用户名参数,默认usernameprivate String usernameParameter;// 密码参数,默认passwordprivate 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)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题-树】--1367.二叉树中的链表

1367.二叉树中的链表 方法:枚举 枚举二叉树中的每个节点为起点往下的路径是否与链表相匹配的路径,为了判断是否匹配设计了一个递归函数dfs(root,head),其中root表示当前匹配到的二叉树节点,head表示当前匹配到的链表节点,整个函数…

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

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

【机器学习】划分训练集和测试集的方法

在机器学习中,我们的模型建立完成后,通常要根据评估指标来对模型进行评估,以此来判断模型的可用性。而评估指标主要的目的是让模型在未知数据上的预测能力最好。因此,我们在模型训练之前,要对训练集和测试集进行划分。…

每天一道算法题(六)——返回一组数字中所有和为 0 且不重复的三元组

文章目录 前言1、问题2、示例3、解决方法4、效果5、注意点 前言 注意:答案中不可以包含重复的三元组。 1、问题 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] n…

Transformer中位置嵌入的几种形式对比

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

git rebase 和 git merge的区别?以及你对它们的理解?

文章目录 前言是什么分析区别后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:git操作相关 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示,持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…

git基本用法和操作

文章目录 创建版本库方式:Git常用操作命令:远程仓库相关命令分支(branch)操作相关命令版本(tag)操作相关命令子模块(submodule)相关操作命令忽略一些文件、文件夹不提交其他常用命令 创建版本库方式: 创建文件夹 在目录下 右键 Git Bush H…

Lesson 04 模板入门

C:渴望力量吗,少年? 文章目录 一、泛型编程1. 引入2. 函数模板(1)函数模板概念(2)函数模板格式(3)函数模板的原理(4)函数模板的实例化&#xff08…

hypermesh学习总结(一)

1、hypermesh导入导出 2、hypermesh如何使用拓扑命令,连接多个几何体为一个? 3、hypermesh模式选择 分别有显示动力学模式explicit,标准模式Standard3D(静力学及模态等)

Linux管道的工作过程

常用的匿名管道(Anonymous Pipes),也即将多个命令串起来的竖线。管道的创建,需要通过下面这个系统调用。 int pipe(int fd[2]) 我们创建了一个管道 pipe,返回了两个文件描述符,这表示管道的两端&#xff…

什么是tomcat, tomcat该如何使用?(java)

tomcat是什么? tomcat翻译过来为汤姆猫, 但是他可不是猫和老鼠中的汤姆, 而是java中的tom, 虽然java中的tomcat没有猫和老鼠那么出名, 但是他仍然是java中的中流砥柱 下图为java中的tomcat, 也就是最右边这个黄色的猫: Tomcat是Apache 软件基金会(Apache Software …