当前位置: 首页 > news >正文

Spring Security 核心组件

Spring Security 是一个功能全面的安全框架,用于处理基于 Spring 应用程序的身份验证和授权。

它提供了开箱即用的支持,采用行业标准的做法和机制来保护你的应用。

无论你是开发简单的 Web 应用还是复杂的微服务架构,理解 Spring Security 的核心组件对于实施健壮的安全措施至关重要。

本文将通过示例引导你了解 Spring Security 的核心组件。

Spring Security 核心组件

Spring Security 的架构围绕几个关键组件展开,这些组件协同工作以保护你的应用。我们将探讨这些组件,并提供使用当前最佳实践的示例。

1. 身份验证 (Authentication)

身份验证是验证用户或系统身份的过程,回答“你是谁?”的问题。Spring Security 支持多种身份验证机制,如表单登录、OAuth2 等。

代码示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).httpBasic(withDefaults()).formLogin(withDefaults());return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails userDetails = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(userDetails);}
}

以上代码是一个典型的 Spring Security 配置示例,用于设置基本的身份验证和授权。以下是对代码的详细解释:

  1. 配置类注解

    • @Configuration:标记该类为配置类。
    • @EnableWebSecurity:启用 Spring Security 的 Web 安全支持。
  2. SecurityFilterChain Bean

    • securityFilterChain 方法定义了安全过滤器链,用于配置 HTTP 安全设置。
    • authorizeHttpRequests:配置请求的授权规则。
      • anyRequest().authenticated():要求所有请求都必须经过身份验证。
    • httpBasic(withDefaults()):启用基本认证(HTTP Basic)。
    • formLogin(withDefaults()):启用表单登录。
  3. UserDetailsService Bean

    • userDetailsService 方法定义了用户详细信息服务。
    • UserDetails:创建一个用户详细信息对象,包含用户名、密码和角色。
    • withDefaultPasswordEncoder:使用默认的密码编码器(不推荐用于生产环境)。
    • InMemoryUserDetailsManager:将用户详细信息存储在内存中。

2. 授权 (Authorization)

身份验证后,授权确定经过身份验证的用户是否有权限执行特定操作或访问资源,回答“你是否可以这样做?”的问题。

代码示例:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorize -> authorize.antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").antMatchers("/public/**").permitAll().anyRequest().authenticated()).formLogin(withDefaults()).httpBasic(withDefaults());return http.build();
}

以上代码用于设置细粒度的请求授权规则。以下是对代码的详细解释:

代码解释

  1. 配置类注解

    • @Configuration:标记该类为配置类。
    • @EnableWebSecurity:启用 Spring Security 的 Web 安全支持。
  2. SecurityFilterChain Bean

    • filterChain 方法定义了安全过滤器链,用于配置 HTTP 安全设置。
    • authorizeRequests:配置请求的授权规则。
      • antMatchers("/admin/**").hasRole("ADMIN"):匹配 /admin/** 路径的所有请求,要求用户具有 ADMIN 角色。
      • antMatchers("/user/**").hasAnyRole("USER", "ADMIN"):匹配 /user/** 路径的所有请求,要求用户具有 USERADMIN 角色。
      • antMatchers("/public/**").permitAll():匹配 /public/** 路径的所有请求,允许所有用户访问。
      • anyRequest().authenticated():所有其他请求都必须经过身份验证。
    • formLogin(withDefaults()):启用表单登录,默认配置。
    • httpBasic(withDefaults()):启用基本认证(HTTP Basic),默认配置。

3. 主体 (Principal)

主体是指当前经过身份验证的用户详细信息,在整个应用中可用于执行用户特定的操作。

使用示例:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
// 使用用户名或其他身份验证对象中的详细信息

4. 授予权限 (Granted Authority)

授予权限定义了经过身份验证的用户的权限,指定他们可以执行的操作或访问的资源。

示例:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorize -> authorize.antMatchers("/api/private/**").hasAuthority("ROLE_USER").anyRequest().permitAll()).httpBasic(withDefaults());return http.build();
}

5. 安全上下文和 SecurityContextHolder

Spring Security 的核心是 SecurityContext,它保存当前经过身份验证的用户详细信息,也称为主体。该上下文可以通过 SecurityContextHolder 在整个应用中访问,允许你根据用户的认证状态和权限执行操作。

示例:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {// 根据经过身份验证的用户执行操作
}

6. 用户详细信息 (UserDetails)

UserDetails 接口是 Spring Security 中的核心部分,表示 Spring Security 用于身份验证和授权过程的用户信息。它向框架提供核心用户信息,如:

  • 用户名:用户的唯一标识符。
  • 密码:用户的密码,通常以哈希格式存储。
  • 启用状态:指示用户是否已启用。禁用的用户无法进行身份验证。
  • 账户未过期、凭证未过期、账户未锁定:这些布尔标志提供额外的详细信息,支持复杂的安全部署需求,如账户过期策略和锁定机制。
  • 权限:表示分配给用户的角色或权限的 GrantedAuthority 对象集合,对于授权决策至关重要。

实现 UserDetails 可以让你的应用程序用户实体与 Spring Security 无缝集成。

7. 用户详细信息服务 (UserDetailsService)

UserDetailsService 是 Spring Security 中的一个核心接口,用于从数据源(如数据库、LDAP、内存等)中加载用户特定的数据。这个接口的主要目的是提供一种标准化的方式来获取用户信息,以便 Spring Security 进行身份验证和授权。

它有一个方法 loadUserByUsername(String username),根据用户名查找用户。返回的 UserDetails 对象随后可供 Spring Security 进一步的身份验证和授权过程使用。

实现你自己的 UserDetailsService 涉及创建一个与用户数据库(或其他用户存储机制)交互的服务,以获取用户详细信息并将其转换为 UserDetails 对象。这个自定义服务成为你的用户数据与 Spring Security 需求之间的桥梁。

8. 认证管理器 (AuthenticationManager)

Spring Security 身份验证过程的核心是 AuthenticationManager 接口。它定义了一个方法 authenticate(Authentication authentication),尝试对传递的 Authentication 对象进行身份验证。

AuthenticationManager 负责协调身份验证过程,将请求委托给一个或多个 AuthenticationProvider 实例。

每个 AuthenticationProvider 可以处理特定类型的身份验证(如用户名和密码、基于令牌的身份验证等)。

AuthenticationManager 根据接收到的 Authentication 对象类型,将身份验证请求路由到能够处理它的提供者。

成功的身份验证过程会生成一个包含主体和授予权限的完整 Authentication 对象,该对象随后存储在 SecurityContext 中,以便后续的授权检查。

配置 AuthenticationManager:
在配置类中直接暴露一个 AuthenticationManager bean。以下是一个示例:

@EnableWebSecurity
public class SecurityConfig {@Beanpublic AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {return authenticationConfiguration.getAuthenticationManager();}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).httpBasic(withDefaults()).formLogin(withDefaults());return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails userDetails = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(userDetails);}
}

结论

总之,掌握 Spring Security 的核心组件对于希望保护其 Spring 应用程序的开发者至关重要。从使用 UserDetailsUserDetailsService 进行身份验证,到通过 GrantedAuthority 进行授权,再到使用 SecurityContextHolder 管理安全上下文,每个元素都在安全生态系统中发挥着关键作用。

WebSecurityConfigurerAdapter 到更模块化配置方法的演变,体现了 Spring Security 对灵活性和定制化的承诺。通过理解核心组件并采用新的配置模型,开发者可以实施针对其应用程序特定需求的健壮安全措施。

注:WebSecurityConfigurerAdapter 是 Spring Security 5 之前版本中常用的抽象类,用于简化安全配置。然而,从 Spring Security 5 开始,官方推荐直接使用 SecurityFilterChain Bean 来进行配置,而不是继承 WebSecurityConfigurerAdapter

相关文章:

Spring Security 核心组件

Spring Security 是一个功能全面的安全框架,用于处理基于 Spring 应用程序的身份验证和授权。 它提供了开箱即用的支持,采用行业标准的做法和机制来保护你的应用。 无论你是开发简单的 Web 应用还是复杂的微服务架构,理解 Spring Security …...

聚焦 AUTO TECH 2025华南展:探索新能源汽车发展新趋势

随着“新四化”浪潮的推进,汽车行业正经历前所未有的变革。中国新能源汽车正逐渐走向世界。国内汽车制造巨头如比亚迪、吉利、奇瑞、长安等,已经将出口提升至核心战略地位。中国新能源汽车的发展,不仅推动了全球汽车产业的电动化转型&#xf…...

Python-简单病毒程序合集(一)

前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…...

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家,开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发,另一种是效率仅次于寄存器难度相对较低的标准库开发,最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…...

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1,创建证书和密钥 需要openssl环境,如果是Window下,下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境,此环境是在jdk环境下 本案例所使用的账号密码均为: ka…...

Pr:音频过渡

Adobe Premiere Pro 自带一组共三个音频过渡 Audio Transitions效果。 对音频剪辑之间应用交叉淡化 Crossfade过渡,操作方式类似于应用视频过渡效果。 对于交叉淡化,要保证前剪辑的出点之后及后剪辑的入点之前有足够的预留内容(也称“手柄”&…...

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感,从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏,但UI元素被限制在安全区内…...

从 const 到 mutable:C++ 中的优雅妥协与设计智慧

在C编程中,const 关键字被广泛应用于确保数据的不变性,它提供了一种强大的机制来防止意外修改,从而增强了代码的可靠性和可维护性。然而,在某些特定场景下,完全的不变性可能会限制设计的灵活性,这时 mutabl…...

CC工具箱使用指南:【CAD导出界址点Excel】

一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个,这个工具则是将CAD导出Excel。 CAD数据如下: 工具将如上截图中的边界线导出界址点Excel,并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…...

制作图片马常用的五种方法总结

目录 1. 以文本方式2. Windows的cmd方式3. PhotoShop方式4. 16进制5. Linux的cat方式 图片马:就是在图片中隐藏一句话木马。利用.htaccess等解析图片为PHP或者asp文件。达到执行图片内代码目的。 1. 以文本方式 用文本方式(这里用notepad。如果用记事本的方式打开…...

深入解析MySQL中的事务处理

一、引言 事务是数据库管理系统执行过程中的一个逻辑单位,它由一系列操作组成,这些操作要么全部执行,要么全部不执行。事务在保证数据的一致性、隔离性、持久性方面发挥着重要作用。MySQL作为一个广泛使用的数据库管理系统,对事务…...

TCP Analysis Flags 之 TCP Dup ACK

前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…...

r-and-r——提高长文本质量保证任务的准确性重新提示和上下文搜索的新方法可减轻大规模语言模型中的迷失在中间现象

概述 随着大规模语言模型的兴起,自然语言处理领域取得了重大发展。这些创新的模型允许用户通过输入简单的 "提示 "文本来执行各种任务。然而,众所周知,在问题解答(QA)任务中,用户在处理长文本时…...

光伏电站的方案PPT总结

现在的市面上每做一个项目,做个项目方案是必不可少的了,光伏电站的项目亦是如此,做一个既美观又有说服力的项目PPT方案就尤为重要,项目PPT方案的全面性,美观度更征服业主,拿下项目,下面我从鹧鸪…...

前端pdf预览方案

前端pdf预览方案 pdf预览一般不需要前端生成pdf文件,pdf文件一般是通过接口,获取pdf文件【responseType:‘blob’,】或二进制文件流【responseType: ‘arraybuffer’,】或者已有的pdf文件。 前端PDF预览通常是通过读取现有的PDF文件,并使用…...

java 深拷贝 浅拷贝 详解

在 Java 中,深拷贝和浅拷贝是对象拷贝(复制)时的两个重要概念,它们决定了拷贝后的对象与原对象之间的关联性。以下是深拷贝和浅拷贝的详解,包括定义、实现方式及其区别。 1. 概念解释 1.1 浅拷贝(Shallow …...

针对git、giteeVSCode连接的使用 || Live Share插件使用

1.下载git 链接 打开终端,桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…...

如何解决Ubuntu 20.04中Vim编辑器在按下Ctrl+S时暂停响应的问题

如何解决Ubuntu 20.04中Vim编辑器在按下CtrlS时暂停响应的问题 在Ubuntu 20.04中使用Vim编辑器时,用户可能会遇到按下CtrlS后编辑器似乎“卡死”或无响应的情况。这个问题实际上源于历史悠久的终端行为,而非Vim本身或操作系统的缺陷。以下是详细的分析及…...

mybatisPlus打印sql配置

MyBatis-Plus 提供了方便的配置方式来打印 SQL 查询语句,以便进行调试和性能分析。可以通过配置 log 来输出 SQL 语句以及执行的参数。 方法 1:通过 application.properties 或 application.yml 配置打印 SQL 可以通过配置 application.properties 或 a…...

Redis 内存管理

参考:面试官:为什么 Redis 不立刻删除已经过期的数据? 目录 1.Redis 给缓存数据设置过期时间有什么用? 2.Redis 是如何判断数据是否过期的呢? 3.Redis 过期 key 删除策略了解么? 4.大量 key 集中过期怎…...

Excel表文本函数、日期和时间函数

一、文本函数 函数说明CHAR返回字符代码所对应的字符CLEAN删除文本中的所有不可打印字符CODE返回文本字符串首字符的代码CONCATENATE合并多个文本字符串EXACT检查两个文本是否完全相同FIND查找文本中某个字符串的位置LEFT从文本的左边开始返回指定数量的字符LEN返回文本字符串…...

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历,分享给大家 作者是如何在没有 iOS 开发经验的情况下,借助 AI(如 Claude 3 模型)成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月,ChatGPT 诞生并迅速引发全球关注。…...

基于Java Springboot幼儿园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...

Python小白学习教程从入门到入坑------习题课2(基础巩固)

目录 一、选择题 二、实战题 2.1 实战1:输入一个年份,判断是否是闰年 2.2 实战2:模拟10086查询功能 2.3 实战3:使用嵌套循环输出九九乘法表 2.4 实战4:猜数游戏 一、选择题 1、以下选项符合Python语法要求且能够…...

基于IPMI_SSH的服务器硬件监控指标解读

随着企业IT架构的日益复杂化,对服务器的实时监控和管理变得至关重要。监控易作为一款功能强大的监控软件,支持通过IPMI_SSH的方式对服务器硬件进行远程监控,确保服务器的稳定运行。本文将针对监控易中基于IPMI_SSH的服务器硬件监控指标进行解…...

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…...

(33)iptables设置防火墙策略常用命令(docker环境、非docker环境)

#普通环境(非docker) # 拒绝所有对端口 31001 的访问 iptables -A INPUT -p tcp --dport 31001 -j DROP # 允许 IP 地址 20.59.30.77 访问端口 31001 (此处用的是虚拟机 所以要使用nat地址的网关) iptables -I INPUT 1 -p tcp -s 20.59.30.77 --dpor…...

fastadmin中动态下拉组件(SelectPage)的使用

实现的功能如下&#xff1a; 1、支持模糊搜索&#xff1b;2、分页功能&#xff1b;3支持多选 官方文档&#xff1a;https://doc.fastadmin.net/doc/178.html html页面引用组件 <div class"form-group"><label class"control-label col-xs-12 col-sm-2…...

通过Python 调整Excel行高、列宽

在Excel中&#xff0c;默认的行高和列宽可能不足以完全显示某些单元格中的内容&#xff0c;特别是当内容较长时。通过调整行高和列宽&#xff0c;可以确保所有数据都能完整显示&#xff0c;避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业&#xff0c;尤其是在…...

力扣-Mysql-3278. 寻找数据科学家职位的候选人 II(中等)

一、题目来源 3278. 寻找数据科学家职位的候选人 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;Candidates ----------------------- | Column Name | Type | ----------------------- | candidate_id | int | | skill | varch…...

深圳西乡做网站/优化大师有必要安装吗

本文首发于我的简书 扫描快速体验本小程序: 这学期受某人所托&#xff0c;给学院做了一款打卡小程序。其效果如下&#xff1a; 一个类似论坛的社区&#xff0c;可发帖、评论、回复。 打卡可换算积分&#xff0c;一天只能打卡一次&#xff0c;且有今日打卡排行榜实时展示。…...

网站建设基本内容/快速优化网站排名的方法

(给前端大学加星标&#xff0c;提升前端技能.)作者&#xff1a;xrkffgghttps://segmentfault.com/a/11900000189936191、 前言1.1 业务场景由前台导入Excel表格&#xff0c;获取批量数据。根据一个数组导出Excel表格。2、 实现原理2.1 引入工具库file-saver、xlsx、script-load…...

免费网站建设软件推荐/唯尚广告联盟app下载

http://dev.yesky.com/359/2145859.shtml 前文我们对非MFC DLL和MFC规则DLL进行了介绍&#xff0c;现在开始详细分析DLL的最后一种类型――MFC扩展DLL。   6.1概论  MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库&#xff0c;其不同点在于MFC扩展DL…...

哪些网站是动态页面/简述网络营销的特点

mysql数据类型介绍(含text,longtext,mediumtext说明) 分类&#xff1a; 数据库2013-10-06 13:00 2367人阅读 评论(0) 收藏 举报转载&#xff0c;文章原连接已经失效&#xff0c;百度快照找到的。 MySQL支持大量的列类型&#xff0c;它可以被分为3类&#xff1a;数字类型、日期和…...

上海南站网站建设公司/包头整站优化

点击蓝字关注我们什么是函数的返回值&#xff1f;C语言函数如果执行成功的话&#xff0c;返回1、返回0还是返回别的值&#xff1f;如果大家还不是很清楚&#xff0c;那么就让小橙同学来给大家介绍一下。C语言简介首先&#xff0c;简单介绍一下C语言。C 语言是一种通用的、面向过…...

盈佳国际天天做赢家网站/软文例文 经典软文范例

Print流 print打印流:只做输出没有输入 打印分为字节打印流和字符打印流 目录Print流PrintWriter: 字符打印流对象输入输出流**作用**:**用法**:**案例一**:对象序列化案例二**一个类声明****对象的输出流**对象的输入流PrintWriter: 字符打印流 print流方法可以打印各种类型…...