什么时候需要用到 @EnableWebSecurity 注解?

有小伙伴在学习 Spring Security 的遇到一个问题:

箭头所指的位置报红,也就是 Spring 容器中没有找到一个类型为 HttpSecurity 的 Bean。

小伙伴说如果他在配置类上加 @EnableWebSecurity 注解,就不报错;不加该注解则会报错。那么到底该不该加 @EnableWebSecurity 注解呢?今天就来和大伙聊一聊这个话题。

一 @EnableWebSecurity

首先我们来说下 @EnableWebSecurity 这个注解。从名字上就能看出来,这个注解就是启动 Spring Security 的,我们来看下这个注解的定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
		HttpSecurityConfiguration.class })
@EnableGlobalAuthentication
public @interface EnableWebSecurity {

	/**
	 * Controls debugging support for Spring Security. Default is false.
	 * @return if true, enables debug support with Spring Security
	 */
	boolean debug() default false;

}

小伙伴们看到,这个注解的核心能力有两方面:

  1. 导入了四个配置类。
  2. 启用了 @EnableGlobalAuthentication 注解。

我们先来看这四个配置类。

1.1 WebSecurityConfiguration

WebSecurityConfiguration 是 Spring Security 框架中的一个核心配置类,它的主要作用是自动配置 Web 安全相关的组件和服务,以确保应用程序的 Web 层安全。

WebSecurityConfiguration 主要有如下一些作用:

  1. 初始化 WebSecurity:它创建并配置了 WebSecurity 对象,这是一个高级抽象,负责配置安全过滤器链(FilterChainProxy),该过滤器链处理所有进入的 HTTP 请求,执行认证、授权、安全头设置、CSRF 保护等安全操作。
  2. 自动配置 SecurityFilterChain:通过 WebSecurityWebSecurityConfiguration 会设置一系列的安全过滤器,这些过滤器形成了 SecurityFilterChain,负责处理所有 Web 请求的安全性。
  3. 配置默认安全行为:它提供了默认的安全配置,如允许未认证访问静态资源、设置默认的登录表单和登出逻辑、异常处理等,这些都是大多数 Web 应用的基础安全需求。
  4. 支持自定义配置:尽管提供了默认配置,WebSecurityConfiguration 也允许开发者通过扩展 WebSecurityConfigurerAdapter(Spring Security5.7及以后版本已被弃用)或直接实现相关接口来自定义安全策略,以满足特定应用的需求。开发者可以覆盖默认的认证、授权规则、安全过滤器等配置。

从这里大家可以看到,WebSecurityConfiguration 是 Spring Security 自动配置的核心,它简化了安全配置过程,同时保持了高度的可定制性,是构建安全 Web 应用不可或缺的一部分。

1.2 SpringWebMvcImportSelector

SpringWebMvcImportSelector 主要是判断当前是不是 Web 环境,如果是,则返回 WebMvcSecurityConfiguration 对象进行配置,WebMvcSecurityConfiguration 在最新版 Spring Security 中已经废弃了。

1.3 OAuth2ImportSelector

OAuth2ImportSelector 主要是检查当前项目有没有使用 OAuth2 Client,如果使用了,则返回和 OAuth2 Client 相关的配置类完成自动配置。

1.4 HttpSecurityConfiguration

HttpSecurityConfiguration 是提供了默认的 HttpSecurity 对象,关于 HttpSecurity 对象松哥在前面的文章中已经详细介绍过了。HttpSecurity 是如何组装过滤器链的。

1.5 @EnableGlobalAuthentication

这个注解主要是为了导入 AuthenticationConfiguration 配置,AuthenticationConfiguration 配置中主要是配置了一些全局的认证器,因为 Spring Security 中的认证器有全局和局部之分(感兴趣的小伙伴可以了解下松哥的Spring Security6+OAuth2 视频精讲)。

从上面的代码中我们可以看到,@EnableWebSecurity 注解存在的意义,主要是就是开启了 Spring Security 的一些默认配置,相当于是一件启用 Spring Security。

二 加还是不加?

一键启用 Spring Security,在没有 Spring Boot 的年代,这确实是个好玩意!

但是!!!

现在我们都是使用 Spring Boot,相信各位小伙伴使用 Spring Security 的场景基本上也都是在 Spring Boot 项目中,而 Spring Boot 中关于 Spring Security 提供了自动化配置类 SecurityAutoConfiguration,当我们分析 SecurityAutoConfiguration 的源码时候,发现其实它里边最终也是调用了 @EnableWebSecurity。

所以,在 Spring Boot 项目中使用 Spring Security 的话,一般是不需要自己手动添加 @EnableWebSecurity 注解的,默认的自动化配置类已经帮我们启用了该注解。

三 问题答案

回到一开始的问题。小伙伴遇到这种问题,一般是两种可能:

  1. IDEA 检测问题,IDEA 提示不能全信,对于这样的报错问题,如果确认自己代码没问题,那就大胆去运行,可能是 IDEA 误报。
  2. 当前配置类没有被 Spring 容器扫描到,即当前配置类不在 Spring 容器中,但是却尝试注入 Spring 容器中的 Bean,于是就有了错误提示。当添加了 @EnableWebSecurity 注解之后,IDEA 检测到有 HttpSecurity 对象导入了,就不报错了,但是问题在根源其实在于当前类没有被注入到 Spring 容器中。

后来证明是第二种原因。

欢迎各位小伙伴一起来精进 Spring Security~

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

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

相关文章

C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍

文章目录 前言打印数组函数一、插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序总结 前言 C语言数据结构排序、插入排序、希尔排序(多组并排、一组排完排另一组)、选择排序、堆排序、冒泡排序等的介绍 打印数组函数 打印数组函数定义 // 打印…

Angular17(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目,可以使用 Angular CLI(命令行界面)。以下是使用 Angular CLI 创建一个新项目的步骤: 1、安装 Angular CLI: 打开你的命令行界面(在 Windows 上是 CMD、PowerShell 或 Git Bas…

反向海淘代购系统|pandabuy系统方案|系统流程讲解:引领全球购物新潮流

随着全球化的深入发展和互联网技术的不断进步,人们的购物方式也在发生着翻天覆地的变化。反向海淘代购系统作为这一变革的杰出代表,正逐渐走进大众视野,为消费者带来前所未有的全球购物体验。 一、反向海淘代购系统的定义 传统的海淘模式主…

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务,包括免费创建自己的设备连接。 首先,登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Flink SQL查询语法部分详解(提供需求、数据练习复现)

一、Hints 动态表选择:可以在查询表的时候动态修改表的参数配置 1、读取kafka的数据建表 CREATE TABLE students (id STRING,name STRING,age INT,sex STRING,clazz STRING ) WITH (connector kafka,topic students, -- 指定topicproperties.bootstrap.servers …

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的,点击选择 输入密码 然后就ok了 ✅ 总结 只能说:玄学!

美洽工作台3.0,全新发布!

美洽工作台3.0,全新发布 想要效率翻倍,就要一步到位! 工作台 3.0,为效率而生 1. 更丰富的外观选择,让界面焕然一新,新增导航主题色选择,深色 Dark、浅色 Light 随意切换 2. 自定义你的专属导…

以真机算力剑指实用化!这家中国量子计算公司的应用探索

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙/王珩 排版丨沛贤 深度好文:1500字丨5分钟阅读 近些年来,由于底层物理的限制,经典集成电路通过缩小工艺制程提升算力的路线正在逼近极限&#xf…

RK3568技术笔记之一 RK3568总体介绍

RK3568是瑞芯微开发出一款很好用的芯片。我先把ROCKCHIP的原厂信息搬过来看看。 首先声明一下,这篇文章里的资讯版权归瑞芯微电子股份有限公司。毕竟是我转过来的嘛。 我自己的心得,版权就归我啦。 搬砖地址Rockchip-瑞芯微电子股份有限公司瑞芯微专注…

Django项目上线-报错汇总

Django项目上线-报错汇总 下列报错基本都是Python环境相关 pip install 报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. debian运行pip报错ssl module in Python is not available - z417 - 博…

Javaweb基础之json

大家好,这里是教授.F 目录 引入: 定义格式: json规制: 字符串转json: json转字符串: 字符串和json转化细节: json在java中的使用: 应用实例: JavaBean和json字符串的转换: l…

解决ESP-IDF工程里面C/C++找不到路径标红的问题

解决ESP-IDF工程里面C/C找不到路径标红的问题 教程 源文件 打开这一个文件 {"configurations": [{"name": "ESP-IDF","cStandard": "c11","cppStandard": "c17","compileCommands": "…

论文AI率过高?掌握这四种技巧轻松降重

随着人工智能技术的突飞猛进,AI生成内容(AIGC)已被广泛用于学术论文撰写中,提高效率同时也带来了原创性的挑战。面对日益严格的学术审查,一个突出的问题是:使用AI代写的论文能否通过内容检测?因…

【数据结构】图论中求最短路径——迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd)

目录 最短路径 (*)迪杰斯特拉算法(Dijkstra)迪杰斯特拉算法(Dijkstra)的算法原理: 弗洛伊德算法(Floyd)弗洛伊德算法(Floyd)的算法原理:弗洛伊德算法的&#…

导弹研究中常用坐标系及坐标系之间的变换

在导弹飞行控制过程中,需要时刻掌握导弹的飞行状态 (速度、位置、姿态角等),这就有赖于描述导弹飞行状态的坐标系。除了大地坐标系和地心大地直角坐标系外,导弹常用的坐标系还有很多,合理而恰当地选择参考系…

【LangChain系列】第二篇:文档拆分简介及实践

在上一篇博客中,我们学习了如何使用LangChain的文档加载器将文档加载为标准格式。加载文档后,下一步是将它们拆分为更小的块。这个过程乍一看似乎很简单,但有一些微妙之处和重要的考虑因素会显着影响下游任务的性能和准确性。 一、为什么文档…

qcom 平台系统签名流程

security boot 平台的东东,oem 可定制的功能有限,只能参考平台文档,可以在高通的网站上搜索:Secure Boot Enablement,然后找对应平台的文档xxx-Secure Boot Enablement User Guide, step by step 操作即可 开机校验流…

【人工智能】第五部分:ChatGPT的实际应用案例和未来发展方向

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

【成品设计】基于STM32的体温监控系统的设计与实现

《基于STM32的体温监控系统的设计与实现》 整体功能: 体温监控系统采用STM32F103VET6单片机为主控,在此基础上移植了一款国产嵌入式操作系统RT-thread进行开发设计的。 该系统的主要工作逻辑为:管理员可先将相关人员的指纹、ID等数据录入系…

AC/DC电源模块的效率如何?

BOSHIDA AC/DC电源模块的效率如何? AC/DC电源模块是一种将交流电转换为直流电的装置,常用于电子设备的电源部分。其效率是指输入电功率与输出电功率的比值,通常以百分比表示。AC/DC电源模块的效率主要取决于以下几个因素:开关频…