当前位置: 首页 > 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 集中过期怎…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...