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

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...