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

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...