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

news2024/12/24 21:12:50

一、简单导入依赖

        1、导入pom

<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测试

@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.coloradmin.cn/o/2059164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伺服电机抖动的解决方案

一、电机运行过程中抖动 1.原因分析 ①增益参数设置不当&#xff1a;增益参数不合适导致系统过于敏感&#xff0c;出现振荡&#xff1b; ②机械共振&#xff1a;机械系统的固有频率与电机运行频率接近&#xff0c;导致共振&#xff1b; ③反馈信号噪声&#xff1a;反馈装置…

KPaaS业务集成扩展平台是什么?有哪些功能?有哪些企业使用了?

KPaaS业务集成扩展平台是什么&#xff1f; KPaaS是由深圳市金众诚科技有限公司推出的&#xff0c;面向中小企业组织的一款企业数字化一站式业务集成扩展平台。 平台采用先进的微服务架构&#xff0c;基于Spring Boot和Spring Cloud技术&#xff0c;集成了Swagger、NGINX、Sen…

国内智能车零部件头号玩家引望:年出货300万套,估值1150亿

作者 |德新 编辑 |王博 8月19日&#xff0c;长安汽车发布公告&#xff0c;其联营企业阿维塔科技在当日的董事会上&#xff0c;通过了对引望公司的投资方案议案。 阿维塔将在8月20日与华为签约&#xff0c;阿维塔将出资115亿元&#xff0c;对引望公司持股10%&#xff0c;华为持…

jmeter简单发送接口

一、安装jmeter 拥有java环境&#xff0c;再下载jmeter 安装之后解压到本地&#xff0c;jmeter中的bin目录配置到环境变量中 之后可以通过cmd中 jmeter.bat命令运行 二、利用jmeter发送接口请求 1、添加线程组 添加->线程->线程组 2、添加http请求 添加->取样器-&g…

Yolov10网络详解与实战(附数据集)

文章目录 摘要模型详解模型实战训练COCO数据集下载数据集 COCO转yolo格式数据集&#xff08;适用V4&#xff0c;V5&#xff0c;V6&#xff0c;V7&#xff0c;V8&#xff09;配置yolov10环境训练断点训练测试 训练自定义数据集Labelme数据集格式转换训练测试 总结 摘要 模型详解…

Tiktok和Facebook广告哪个效果更好?

Tiktok广告作为新兴的数字营销工具&#xff0c;以其独特的短视频格式在全球范围内迅速获得了广泛的受众关注&#xff0c;如今已经和Facebook并列成为了社交媒体营销广告的两巨头&#xff0c;刚开始做海外社交媒体广告的朋友可能会纠结&#xff0c;这两者哪个的广告效果更好&…

大模型微调课程及大模型应用开发课程介绍

大模型实验室是在学校现有的实验室建设基础上&#xff0c;依托行业标杆企业&#xff0c;聚焦行业大模型产业发展方向&#xff0c;建设一个产学研一体化的合作教学平台&#xff0c;形成“教与学紧密结合、理论与实践紧密结合&#xff0c;学校与企业紧密结合”的创新教育模式。大…

搭建 PXE 远程安装服务器和设置 Kickstart 无人值守安装

目录 搭建 PXE 远程安装服务器 1.安装并启用 TFTP 服务 2.安装并启用 DHCP 服务 3.准备 Linux 内核、初始化镜像文件 4.准备 PXE 引导程序 5.安装FTP服务&#xff0c;准备CentOS 7 安装源 6.配置启动菜单文件 7.关闭防火墙&#xff0c;验证 PXE 网络安装 设置 Kicksta…

SpringSecurity6

一、Spring Security概述 1、Spring Security简介 ​ Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean&#xff0c;充分利用了 Spring IoC&#xff08;Inversion of…

el-table实现动态添加行,并且有父子级联动下拉框

<template><div><el-button click"addRow">添加行</el-button><el-table :data"tableData" style"width: 100%"><el-table-column label"序号"type"index"width"100"align"…

flink读写案例合集

文章目录 前言一、flink 写kafka1.第一种使用FlinkKafkaProducer API2.第二种使用自定义序列化器3.第三种使用FlinkKafkaProducer011 API4.使用Kafka的Avro序列化 (没有使用过,感觉比较复杂)5.第五种使用 (强烈推荐使用)二、Flink读kafka三、Flink写其他外部系统前言 提示:这…

【Kettle实战】组件讲解(战前磨刀)

目录 【 CSV 文件输入 】组件【过滤记录】组件【字段选择】组件【排序记录】组件【分组】组件【Excel输出】组件【 CSV 文件输入 】组件 基础参数解释: 字段参数解释: 【过滤记录】组件 在数据处理时,往往要对数据所属类别、区域和时间等进行限制,将限制范围外的数据过…

上千条备孕至育儿指南速查ACCESS\EXCEL数据库

虽然今天这个数据库的记录数才不过区区上千条&#xff0c;但是每条记录里的内容都包含四五个子标题&#xff0c;可以将相关的知识完整且整齐的展现&#xff0c;是个属于简而精的数据库。并且它包含2级分类。 【备孕】大类包含&#xff1a;备孕百科(19)、不孕不育(23)、精子卵子…

QStorageInfo 出现C2228报错

这里使用 QStorageInfo info(QDir(path));创建就会报错 改为 // 获取给定路径所在的磁盘信息 QDir d(path); QStorageInfo info(d);就不会报错&#xff0c;怪噻&#xff01;

【区块链+商贸零售】消费券 2.0 应用方案 | FISCO BCOS应用案例

方案基于FISCO BCOS区块链技术与中间件平台WeBASE&#xff0c;实现新一代消费券安全精准高效发放&#xff0c;实现消费激励&#xff0c; 促进消费循环。同时&#xff0c;方案将用户消费数据上链&#xff0c;实现账本记录与管理&#xff0c;同时加密机制保证了数据安全性。

基于python的坦克游戏的设计与实现

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 随着互联网的日益普及、python语言在Internet上的实现&#xff0c;python应用程序产生的 互联网增值服务逐渐体现出其影响力&#xff0c;对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文中介绍了python的相…

梯度、偏导数、导数

梯度 对于一个多变量函数 f(x1,x2,…,xn)&#xff0c;其梯度 ∇f 是一个 n 维向量&#xff0c;定义为&#xff1a; ​ 是函数 f在 方向上的偏导数。 偏导数 偏导数是多元函数在某一个方向上的导数&#xff0c;它描述了函数在该方向上的局部变化率。偏导数的计算过程涉及对函…

ARR 竟然超过 150 万美元!斯坦福都在使用的 AI 学术搜索引擎 Consensus获 USV 领投的 1100 万美元。

惊爆&#xff01;就在当下&#xff0c;AI 学术搜索引擎 Consensus 传来令人震撼的消息&#xff0c;其已成功完成 1100 万美元融资。此轮 A 轮融资由 Union Square Ventures 领衔主导&#xff0c;其他参与的投资者有 Nat Friedman、Daniel Gross 以及 Draper Associates 等等。 …

springboot大学生时间管理分析系统---附源码130930

摘 要 时间是一种无形资源,但可以对其进行有效的使用与管理。时间管理倾向是个体在运用时间方式上所表现出来的心理和行为特征&#xff0c;具有多维度、多层次的心理结构&#xff0c;由时间价值感、时间监控观和时间效能感构成。时间是一种重要的资源,作为当代大学生,在进行生…

【UltraVNC】私有远程工具VNC机器部署方式

旨在解决监控端非固定IP的计算机A,远程连接受控的端非固定IP的计算机B。 一、UltraVNC下载和安装 官网:Home - UltraVNC VNC OFFICIAL SITE, Remote Desktop Free Opensource 二、部署私有的远程维护VNC机器-方式一 UltraVNC中继模式原理: UltraVNC中继模式部署: 1.1 中…