初识spring security (一),一文弄懂默认配置

ops/2024/9/20 7:05:09/ 标签: spring, java, 前端

一、简单导入依赖

        1、导入pom

java"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springsecurity-simple-demo</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>8</java.version></properties><dependencies><!-- web 支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringSecurity依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

2、创建controller测试

java">@SpringBootApplication
public class SpringSecuritySimpApplication {public static void main(String[] args) {SpringApplication.run(SpringSecuritySimpApplication.class,args);}
}@RestController
public class HelloController {@RequestMapping("hello")public String hello() {return "hello world";}}

3、简单导入后,接口资源就受到保护了,是什么原理,以下引申出三个问题

1如何在只是导入了一个springsecurity-statar 所有的接口都进行保护了;

2、登录页面的这个html 是从何而来,我们自己项目也没有写html怎么就出来了;

3、登录页的这个user 以及默认的用户名和密码是怎么来的;

二、问题1:只是导入了一个springsecurity-statar 依赖,为何 所有的接口都进行保护了

2.1  DelegatingFilterProxy  

  DelegatingFilterProxy  作用是打通servlet 和spring 通讯的桥梁,介入servilet 容器和spirng 应用;我们在DelegatingFilterProxy  基础上使用spring提供的过滤器都被该过滤器所代理;

2.2 FilterChainProxy 、

FilterChainProxy 为过滤器链,允许委托其他多个过滤器,底层实现,框架做好了,不需要我们处理;

2.3  SecurityFilterChain 

SecurityFilterChain 我们自己配置使用的过滤器链,提供我们自定义配置;该类是我们接触到的,最终也是要配置该过滤器来实现一系列的验证

2.4  SpringBootWebSecurityConfiguration 

SpringBootWebSecurityConfiguration 每一个starter都有一个autoconfig入口配置,该类是入口,从该类开始出发,追求答案

2.4.1  注解 @ConditionalOnDefaultWebSecurity

进入后,导入了一个 DefaultWebSecurityCondition 的类

2.4.1.1 源码

2.4.2 @Conditional(DefaultWebSecurityCondition.class)

   里面有个conditon注解@Conditional(DefaultWebSecurityCondition.class),DefaultWebSecurityCondition进去后看到里面有两个方法;
条件1:@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class }) 判断是否有class文件,SecurityFilterChain 或者HttpSecurity,只要导入了,肯定会有这两个class的文件;即使我们不配置;
条件2:@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })   找不到对应的bean,注意这个是bean,而不是class,因我们创建的时候,没有重写或者继承WebSecurityConfigurerAdapter 所以是找不到的;至此该注解条件生效;

2.4.2.1 源码截图

2.4.3  WebSecurityConfigurerAdapter  

该类作用:后续我们可以继承该类,用于重写里面方法,配置自己的验证规则;

跟随代码  @ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class) 进到该类后,找到 configure(HttpSecurity http)  方法,是不是一下子豁然开朗了;看到了我们熟悉的配置;

  这个配置是不是很熟悉了: http.authorizeRequests((requests) -> requests.anyRequest().authenticated());

所有的请求都需要认证;至此,导入依赖自动加了认证;spring官方也推荐我们重写该方法配置;

三、问题2:登录页面的这个html 是从何而来

是不是有疑问,这个页面我自己项目也没写,怎么就到这个form表单页面了;

3.1  FormLoginConfigurer 

FormLoginConfigurer中的init() 可以得知,初始化会调用 ,该方法做了什么,是不是初始化了一个DefaultLoginPageGeneratingFilter 的过来器

3.1.1 源码截图

3.2  流程分析

1. 请求/hello 接口,在引入 spring security 之后会先经过一些列过滤器

2. 在请求到达 FilterSecuritylnterceptor时,发现请求并未认证。请求拦截下来,并抛出

AccessDeniedException 异常。

抛出AccessDeniedExceptsn 的异常会被 ExceptionTranslationFilter 捕获,这个Filter 中

会调用 LoginUrlAuthenticationEntryPoint#commence 方法给客户端返回 302,要求客户

端进行重定向到 /login 页面。

4. 客户端发送/login 请求。

5. /login 请求会再次被拦截器中 DefaultLoginPageGeneratingFilter 拦截到,并在拦截器中返回生成登录页面。

3.3  DefaultLoginPageGeneratingFilter

DefaultLoginPageGeneratingFilter 默认的redirect页面,至此自动生成的登录页面是通过浏览器生成一个表单写出的;

3.3.1 源码截图

四、问题3:默认的用户名和密码是怎么来的

是不是疑问为什么控制台能打印出密码呢,怎么实现的;

4.1 http.formLogin()方法

用来初始化表单一些配置,如用户名 密码 等;

4.1.1 源码

4.2 FormLoginConfigurer 新建

4.3 UsernamePasswordAuthenticationFilter 

UsernamePasswordAuthenticationFilter 通过构造方法里面new了一个token过滤器,查看attemptAuthentication 方法 

4.4  断点调试 ProviderManager

通过  Authentication 参数可以知道传过来的是 一个UsernamePasswordAuthenticationToken 对象;

4.5 DaoAuthenticationProvider 最终实现类

4.5.1  InMemoryUserDetailsManager

   跟踪后得知,UserDetailsService的实现类是InMemoryUserDetailsManager,最终从内存中获取到用户信息,然后得到密码;

4.6 InMemoryUserDetailsManager 基于内存的用户会生效

我们也没有配置这个基于内存的用户信息,为什么自动生成用户和密码了

4.6.1  UserDetailsServiceAutoConfiguration

一般默认配置都是有一个starter 启动器

4.6.2  @ConditionalOnClass(AuthenticationManager.class)

由注解得知,@ConditionalOnClass(AuthenticationManager.class)
当类中有AuthenticationManager,导入依赖后,肯定会有;
@ConditionalOnMissingBean(
        value = { AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class,
                AuthenticationManagerResolver.class };

当bean中没有 AuthenticationManager并且UserDetailsService并且AuthenticationProvider 时候,该类就生效;

所以说,只要我们重新定义了这三个其中一个设置为bean,那么基于InMemoryUserDetailsManager 这个就不生效了,这就是为什么我们实现了UserDetailsService后,就没有内存认证的这个类了;


http://www.ppmy.cn/ops/97229.html

相关文章

定制开发AI智能名片商城小程序:融合销售策略与个人魅力的营销新路径

摘要&#xff1a;在数字化时代&#xff0c;营销策略的创新与个性化成为企业脱颖而出的关键。本文探讨了如何通过定制开发AI智能名片商城小程序&#xff0c;结合销售策略与个人魅力&#xff0c;实现用户心甘情愿购买产品的目标。通过分析用户行为、心理需求及市场趋势&#xff0…

django之反向关系查询<related_model>_set/related_name

假设有两个模型&#xff1a;Author和Post&#xff0c;其中Post模型通过ForeignKey字段与Author模型相关联。 模型定义 from django.db import modelsclass Author(models.Model):first_name models.CharField(max_length30)last_name models.CharField(max_length30)class …

src资产收集心得

src平台的收录公告 ● 有的src平台公告中写着不要哪些站的洞得看清楚不然白忙活 ● 给你的是根域还是业务范围 收集方法/工具 ● oneforall(功能强大你需要配置api能配就配下&#xff0c;比较耗时) ● 灯塔&#xff08;本人不用&#xff09; ● layer ● fofa、quake、hunte…

EmguCV学习笔记 C# 5.2 仿射变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

vba自动发送邮件的基础步骤?有哪些流程?

vba自动发送邮件如何设置&#xff1f;vba自动发送邮件的技巧&#xff1f; 如果你想节省时间&#xff0c;提高工作效率&#xff0c;学会如何使用VBA自动发送邮件是一个非常有用的技能。AokSend将为你介绍VBA自动发送邮件的基础步骤&#xff0c;并通过简单的分段来详细讲解。 v…

[数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;316 标注数量(xml文件个数)&#xff1a;316 标注数量(txt文件个数)&#xff1a;316 标注类别…

精益管理|介绍一本专门研究防错法(Poka-Yoke)的书

在现代制造业中&#xff0c;如何确保产品在每个生产环节中不出现错误是企业追求的目标之一。而实现这一目标的关键技术之一就是防错法&#xff08;Poka-Yoke&#xff09;。作为一种简单而有效的精益管理、六西格玛管理工具&#xff0c;防错法帮助企业避免因人为错误或工艺不当导…

共享打印机修复工具哪个好_2024年共享打印机修复工具推荐

共享打印机修复工具哪个好&#xff1f;最近几年使用过共享打印机的小伙伴遇到各种共享错误&#xff0c;出现0x00000709和0x0000011b访问共享打印机问题&#xff0c;各种打印机修复工具也有&#xff0c;下面小编就给大家介绍共享打印机修复工具哪个好用分析。 共享打印机修复工具…

用Python实现生信分析——序列搜索和比对工具详解

1. 什么是序列搜索和比对工具&#xff1f; 序列搜索和比对工具在生物信息学中用于在大型序列数据库中搜索与查询序列相似的序列&#xff0c;并进行比对分析。这些工具可以帮助研究人员识别与目标序列相关的已知序列&#xff0c;从而推测其功能、结构和进化关系。 常见的序列搜…

2024零基础转行做程序员,选什么语言更好就业?

零基础转行做程序员&#xff0c;选什么语言更好就业&#xff0c;未来的发展前景更好&#xff1f; 这个问题困扰了不少想转行的同学。有人说Python简单好上手&#xff0c;有人说Java就业机会多&#xff0c;有人说C薪资高&#xff0c;到底该怎么选&#xff1f; 其实各个语言的发…

安泰电压放大器的设计要求是什么样的

电压放大器的设计要求是一个广泛而复杂的领域&#xff0c;它在电子工程中扮演着至关重要的角色。电压放大器是一种电子电路&#xff0c;用于将输入信号的电压增大&#xff0c;而不改变其波形&#xff0c;通常用于放大微弱的信号以便进行后续处理或传输。下面将详细介绍电压放大…

【Vue3】编程式路由导航

【Vue3】编程式路由导航 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

Linux驱动开发基础(中断)

所学来自百问网 目录 1. 嵌入式中断系统 2. 中断处理流程 3. 异常向量表 4. Linux系统对中断的处理 4.1 ARM 处理器程序运行的过程 4.2 保护现场 5. Linux 系统对中断处理的演进 5.1 硬件中断和软件中断 5.2 中断拆分(上半部和下半部) 5.2.1 tasklet 5.2.2 工作队列…

从零开始学习网络安全渗透测试之信息收集篇——(二)WEB前端JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

0、什么是JS渗透测试? 在Javascript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞JS开发的WEB应用和PHP&#xff0c;JAVA,NET等区别在于即没有源代码&#xff0c;也可以通过浏览器的查看源代码获取真实的点。获取URL&#xff0c;获取JS敏感信息&#…

深度学习(9)---ResNet详解

文章目录 一、思考题二、残差块三、网络结构 一、思考题 1. 问题&#xff1a;在一个神经网络中加深更多的层&#xff0c;总是改进精度吗&#xff1f; 2. 答&#xff1a;不一定。  如下面这幅图所示&#xff0c;蓝色五角星表示最优值&#xff0c;标有 F i F_i Fi​ 的闭合区域…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(二)---ROS2与UE5进行图像数据传输

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础&#xff0c;Nav2相关的学习教程可以参考本人的其他博…

本地生活服务平台源码在哪里?2大获取渠道源码质量解析!

当前&#xff0c;本地生活赛道的发展潜力和收益前景已经日渐显化&#xff0c;本地生活服务商的数量也随之不断增长。不过&#xff0c;由于官方平台对于其本地生活服务商的申请条件并未放宽&#xff0c;因此&#xff0c;新增本地生活服务商中的绝大多数都会选择部署本地生活服务…

海康VisionMaster使用学习笔记12-通信框架介绍

1. 通信的用途 用途: 通信是连通算法平台和外部设备的重要渠道&#xff0c;在算法平台中既支持外部数据的读入也支持数据的写出&#xff0c;当通信构建起来以后既可以把软件处理结果发送给外界&#xff0c;又可以通过外界发送字符来触发相机拍照或者软件运行。 2. 通信的种类…

Spring Boot集成钉钉群通知机器人

文章目录 一、钉钉机器人配置1&#xff09;添加机器人2&#xff09;添加自定义机器人3&#xff09;设置机器人参数4&#xff09;添加机器人完成 二、依赖导入三、工具类封装四、关键字推送消息测试类1&#xff09;测试类2&#xff09;程序输出结果&#xff1a;3&#xff09;通知…

【Rust光年纪】探秘Rust语言数学优化库:从凸优化到线性规划

探索Rust语言中的数学优化&#xff1a;库功能对比与应用建议 前言 随着数据科学和数学优化在科研和工程领域的广泛应用&#xff0c;对于Rust语言的数学优化库需求日益增长。本文将介绍几个用于Rust语言的数学优化库&#xff0c;包括其核心功能、使用场景、安装与配置方法以及…