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

news2025/4/6 8:23:01

有小伙伴在学习 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~

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

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

相关文章

如何快速定位到影响mysql cpu飙升的原因——筑梦之路

通常我们只需要执行show processlist 进行查看,一般执行时间最长的SQL八九不离十就是罪魁祸首,但当show processlist的输出有近千条,那么很难第一眼就发现有问题的SQL,那么如何快速找到呢?其实也非常简单。我们知道mys…

什么样的男士内裤比较好?按这个方法选男士内裤不会出错!

男士内裤作为日常穿着的重要服饰,其舒适度与卫生性对男士们的健康至关重要。随着时代的变迁,男士内裤的款式与材质也日益丰富多样,为男士们提供了更多选择。 目前市场上,男士内裤主要分为三角、平角和四角三大类别。其中&#xf…

直播商城源码-PC+APP+H5+小程序现成源码

随着电商行业的不断演进,直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案,使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…

ai对话虚拟人app有哪些?一起来看看这3款

ai对话虚拟人app有哪些?在当前的科技浪潮中,AI对话虚拟人app已经成为我们日常生活中的得力助手。它们不仅提供了更加智能、便捷的交流和信息服务,还让我们能随时随地与AI伙伴进行深度互动。这些app的广泛应用,不仅提升了我们的生活…

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:海洋垃圾检测数据集,真实拍摄海洋海底场景高质量垃圾检测图片数据,涉及场景丰富,比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…

期刊的分类与级别

在学术界,期刊的分类与级别构成了一个评价学术成果和学者贡献的重要标准,同时也是学术出版与学术交流的基础。然而,对于初涉学者来说,理解期刊的分类与级别可能并不直观。本文旨在提供一个系统性的解释,并阐述为何期刊…

LeetCode刷题之HOT100之跳跃游戏

2024/6/5 今天下起了绵密细雨,空气清新很多。昨晚做的梦较魔幻,可能也是导致我睡觉时业已破损的小米手环8的表腕断裂的因素之一。来到实验室,打扫一下卫生,听听歌,做道题。好不自在呀! 1、题目描述 2、逻辑…

SD NAND的垃圾回收机制:无人机数据管理的隐形守护者

随着科技的飞速发展,无人机在各个领域的应用越来越广泛,从航拍到物流配送,再到农业监测,无人机正逐渐成为我们生活中不可或缺的一部分。而SD NAND作为一种创新的存储芯片,可以直接贴片使用,具有小尺寸、高可…

基于SpringBoot+Vue旅游民宿信息管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口

问题描述: 在qt中开发重播模块时,第一次在窗口正常播放,点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析: 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄,导致vlc视频播放窗口没有嵌…

python11 序列的相关操作

枚举遍历 序列的相关操作 text "hello,python" # in 判断字符是否在序列中,存在返回true,否则返回false print(p是否存在:,(p in text)) print(a是否存在:,(a in text)) # not in 判断字符不在序列中,不存在返回true,否则返回false print(p不…

数据仓库与数据挖掘总复习练习2-3(实验六 2024.6.5)

一、练习2 is_unique是否值唯一 range(范围,步长) head()、tail()默认显示5条 缺失值情况 计算(最少多少元素求和、元素相乘) pct_change() latax(工具:专用于写公式&a…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

深度学习——卷积神经网络(CNN)

深度学习 深度学习就是通过多层神经网络上运用各种机器学习算法学习样本数据的内在规律和表示层次,从而实现各种任务的算法集合。各种任务都是啥,有:数据挖掘,计算机视觉,语音识别,自然语言处理等。‘ 深…

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面: 1. 系统架构设计:确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理:建…

处理无法拉取GitHub库的解决方案

提交和拉取github上的库总是失败,这里记录一下如何使用代理解决。 首先找到端口,记住它的端口 然后使用git命令 # HTTP/HTTPS 协议 git config ––global http.url.proxy http://127.0.0.1:port # 以 Github 为例 git config ––global http.https:/…

基于51单片机步进电机控制—9个等级

基于51单片机步进电机控制 (仿真+程序+设计报告) 功能介绍 具体功能: 1.使用L298驱动步进电机转动,可分为9个速度等级(1级最快,9级最慢); 2.使用74HC595驱…

vscode+latex设置跳转快捷键

安装参考 https://blog.csdn.net/Hacker_MAI/article/details/130334821 设置默认recipe ctrl P 打开设置,搜索recipe 也可以点这里看看有哪些配置 2 设置跳转快捷键

54.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(2)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:53.WEB渗透测试-信息收集-端口、目录扫描、源码泄露(1) 关于源码…

如何使用vsCode打开intel D435i深度相机

一、下载并安装相机SDK文件 1.SDK下载地址: Release Intel RealSense™ SDK 2.0 (v2.54.2) IntelRealSense/librealsense GitHub 2.下载后,双击即可安装 3.环境配置 1)window的开始菜单,搜索环境变量,选择编辑系…