【Java进阶】Spring Security详解

🍂枫言枫语:我是予枫,一名行走在 Java 后端与多模态 AI 交叉路口的研二学生。

“予一人以深耕,观万木之成枫。”

在这里,我记录从底层源码到算法前沿的每一次思考。希望能与你一起,在逻辑的丛林中寻找技术的微光。

简介:Spring Security 是基于过滤器链的成熟安全框架,提供认证、鉴权及防御 CSRF 等攻击的核心功能,支持多种认证方式与灵活的权限控制模型。

Spring Boot 版本Spring Security 版本Java 最小版本Jakarta EE 规范状态/建议
4.0.x7.0.xJava 17 (推荐 25)Jakarta EE 11最新代次,支持 Passkeys、OTT
3.4 / 3.56.4 / 6.5Java 17Jakarta EE 10主流稳定,目前企业新项目首选
3.0 - 3.36.0 - 6.3Java 17Jakarta EE 10稳定版,彻底废弃了旧版继承配置
2.1 - 2.75.1 - 5.8Java 8 / 11Java EE 8 / J2EE维护/旧版,仍有大量老项目在使用
1.5.x4.2.xJava 7 / 8J2EE已过期,极老项目可见

更详细的介绍https://blog.csdn.net/m0_58782205/article/details/156912779

Spring Security(在 Spring Boot 环境中通常被称为 Spring Boot Security)是 Spring 家族中专门负责安全的一个子项目。

简单来说,它是为基于 Spring 的应用程序提供身份验证(Authentication)授权(Authorization)以及常见攻击防护的行业标准框架。


一、核心功能

Spring Security 主要解决两个核心问题:

  • 认证(Authentication):确认“你是谁”。例如:通过用户名/密码登录、手机验证码登录、OAuth2(微信、GitHub 登录)等。

  • 授权(Authorization):确认“你能做什么”。例如:管理员可以删除用户,而普通用户只能查看自己的个人资料。

此外,它还提供了防范常见 Web 攻击的能力,如:

  • CSRF(跨站请求伪造)@

  • Session Fixation(会话固定攻击)@

  • XSS(跨站脚本攻击)@


二、核心工作原理

Spring Security 的底层完全基于Servlet过滤器(Filters。当你发起一个请求时,它会经过一系列的过滤器链(Security Filter Chain),每个过滤器负责不同的安全逻辑。

关键组件:

  1. SecurityFilterChain:包含一组过滤器,决定请求是否需要经过认证,或者是否符合特定的访问权限。

  2. AuthenticationManager:认证管理器,负责协调不同的认证方式(如从数据库查用户信息,或从 LDAP 查)。

  3. UserDetailsService:核心接口,用于从数据库或其他来源加载用户的详细信息(用户名、密码、权限)。

  4. SecurityContextHolder:用于存储当前已认证用户的详细信息,你可以在代码的任何地方获取当前登录的用户。


三、为什么在 Spring Boot 中使用它?

在没有 Spring Boot 之前,配置 Spring Security 非常繁琐(需要大量的 XML 或 Java 配置)。

Spring Boot 通过spring-boot-starter-security极大地简化了这一过程:

  • 开箱即用:只要引入依赖,你的所有接口都会被默认保护起来,必须登录才能访问。

  • 自动配置:它会自动配置一个默认的用户(用户名为user,密码在控制台打印)。

  • 易于定制:你可以通过继承WebSecurityConfigurerAdapter(旧版)或声明SecurityFilterChainBean(新版)轻松修改安全策略。


1.认证 vs 授权:对比

特性身份验证 (Authentication)授权 (Authorization)
定义确认用户的身份确认用户拥有的操作权限
常见方式账号密码、JWT、OAuth2、双重认证基于角色 (RBAC)、基于具体权限
例子输对密码登录系统只有“经理”角色才能查看工资单

2. 常见的使用场景

  1. 传统的 Web 应用:使用 Session + Cookie 维持登录状态。

  2. 前后端分离项目:结合JWT(JSON Web Token),通过拦截器或过滤器校验 Token,实现无状态认证。

  3. 微服务安全:配合OAuth2.0OIDC,实现分布式系统的统一身份认证(单点登录)。

四、示例

我们回到目前企业级开发中最主流、最稳健的版本:Spring Boot 3.x +Spring Security6.x

这个版本是目前大多数公司新项目的首选,也是面试中最常被问到的版本。


1.环境准备 (Maven)

pom.xml中引入依赖。Spring Boot 3.x 默认集成的就是 Spring Security 6.x。

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

2.核心配置类:SecurityFilterChain

在 6.x 版本中,官方已经完全废弃WebSecurityConfigurerAdapter。现在的标准写法是向 Spring 容器注入一个SecurityFilterChainBean。Spring Security

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http // 1. 禁用 CSRF(如果是前后端分离项目,通常关闭) .csrf(csrf -> csrf.disable()) // 2. 配置请求授权 .authorizeHttpRequests(auth -> auth .requestMatchers("/auth/**", "/public/**").permitAll() // 所有人可访问 .requestMatchers("/admin/**").hasRole("ADMIN") // 需 ADMIN 角色 .anyRequest().authenticated() // 其他所有请求需登录 ) // 3. 开启表单登录(Spring Security 自带的登录页) .formLogin(form -> form .defaultSuccessUrl("/home") // 登录成功后的跳转地址 .permitAll() ) // 4. 开启 HTTP Basic 认证(可选,用于 API 测试) .httpBasic(Customizer.withDefaults()); return http.build(); } }

3.用户与密码配置

你需要配置用户数据源和加密方式。在 Spring Security 6.x 中,密码必须加密,否则会报错。

import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration public class UserDetailConfig { // 配置密码加密器:使用 BCrypt 强哈希算法 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // 配置用户数据源:这里先用内存模式演示 @Bean public UserDetailsService userDetailsService() { UserDetails user = User.builder() .username("yufeng") .password(passwordEncoder().encode("123456")) // 密码加密存储 .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") .password(passwordEncoder().encode("admin123")) .roles("ADMIN", "USER") .build(); return new InMemoryUserDetailsManager(user, admin); } }

4.编写接口测试

创建一个简单的 Controller 来验证权限控制。

import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @GetMapping("/public/test") public String publicApi() { return "公开接口,无需登录"; } @GetMapping("/user/info") public String userApi() { return "普通用户接口,登录后可见"; } @GetMapping("/admin/manage") public String adminApi() { return "管理员接口,仅 ADMIN 角色可见"; } }

5.核心逻辑拆解

  1. 认证拦截:当你访问/user/info时,AuthorizationFilter发现你未登录,会触发ExceptionTranslationFilter重定向到登录页。

  2. 密码校验:登录时,DaoAuthenticationProvider会调用UserDetailsService拿用户信息,并用PasswordEncoder比对你输入的密码。

  3. 角色前缀:在代码里写.hasRole("ADMIN")时,Spring Security 默认会自动在前面补上ROLE_。所以数据库或内存里存储的权限名应该是ROLE_ADMIN


五、WebSecurityConfigurerAdapter VS SecurityFilterChain

1.WebSecurityConfigurerAdapter (旧时代的基石)

在 Spring Security 5.7 之前,这是所有开发者绕不开的基类。

  • 实现方式基于继承(Inheritance-based)。你需要创建一个类继承它,并重写configure(HttpSecurity http)方法。

  • 设计模式:它是典型的“模板方法模式”。父类定义了流程,子类填充细节。

  • 局限性

    • 耦合:你的配置类必须死死地绑定在 Spring Security 的特定基类上。

    • 灵活性差:如果你想在同一个应用中配置多个逻辑完全不同的过滤器链,继承模式会变得非常臃肿和难以维护。

    • 不符合 Spring Boot 理念:Spring Boot 核心理念是“组合优于继承”,倾向于通过@Bean注入来配置组件。


2.SecurityFilterChain Bean (现代标准)

这是从 Spring Security 5.7 开始引入,并在 6.x 中成为唯一标准的写法。

  • 实现方式基于组件 (Component-based)。你不再继承任何类,而是向 Spring 容器注入一个类型为SecurityFilterChain@Bean

  • 核心逻辑

@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .formLogin(Customizer.withDefaults()); return http.build(); // 关键:手动构建并返回对象 }
  • 优势

    • 解耦:你的配置类是一个纯粹的 Spring 配置类,不再依赖复杂的继承体系。

    • 多链并行:你可以非常轻松地定义多个SecurityFilterChainBean。例如,一个用于/api/**(基于 JWT),另一个用于/web/**(基于 Session),只需通过@Order注解指定优先级即可。

    • 测试友好:由于它是独立的 Bean,在进行单元测试或集成测试时,Mock 和替换变得更加简单。


3.核心对比表

特性WebSecurityConfigurerAdapter (旧)SecurityFilterChain Bean (新)
配置风格继承 (extends)Bean 注入 (@Bean)
构建方式框架自动调用 configure 方法开发者调用 http.build() 手动返回
版本状态已彻底移除 (6.x)当前标准实现
Lambda 支持支持,但不强制强制推荐,写法更现代
多配置处理需定义多个内部静态类继承 Adapter定义多个 @Bean 配合 @Order 即可

4.架构图解:它是如何工作的?

在 6.x 架构中,SecurityFilterChain本质上是一个包含了一组Filter的列表。当请求进来时:

  1. DelegatingFilterProxy接收请求。

  2. 将其委托给FilterChainProxy

  3. FilterChainProxy会查看你定义的所有的SecurityFilterChainBean。

  4. 根据路径匹配(RequestMatcher)找到最合适的那条“链”,然后让请求依次通过链上的过滤器。

关于作者: 💡予枫,某高校在读研究生,专注于 Java 后端开发与多模态情感计算。💬欢迎点赞、收藏、评论,你的反馈是我持续输出的最大动力!

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:

https://cloud.tencent.com/developer/support-plan?invite_code=9wrxwtlju1l

当前加入还有惊喜相送!

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

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

相关文章

VibeThinker-1.5B数学推理能力拆解:HMMT25得分50.4背后技术

VibeThinker-1.5B数学推理能力拆解&#xff1a;HMMT25得分50.4背后技术 1. 引言&#xff1a;小模型大能力——VibeThinker-1.5B的定位与价值 近年来&#xff0c;大模型在数学推理和代码生成任务中表现突出&#xff0c;但其高昂的训练与推理成本限制了广泛部署。在此背景下&am…

薄板PCB未来会如何发展?

问&#xff1a;薄板PCB主要用在哪些领域&#xff1f;不同领域对制造工艺有什么特殊要求&#xff1f;薄板 PCB 的核心优势是轻薄化和高密度&#xff0c;主要应用在五大领域&#xff0c;每个领域对制造工艺都有针对性要求&#xff1a;第一是消费电子领域&#xff0c;包括智能手机…

AnimeGANv2技术剖析:轻量化模型的实现原理

AnimeGANv2技术剖析&#xff1a;轻量化模型的实现原理 1. 引言&#xff1a;从真实到二次元的风格跃迁 随着深度学习在图像生成领域的持续突破&#xff0c;AI驱动的风格迁移技术正逐步走入大众视野。其中&#xff0c;AnimeGANv2 作为专为“照片转动漫”设计的生成对抗网络&…

AnimeGANv2应用案例:动漫风格电子邀请函

AnimeGANv2应用案例&#xff1a;动漫风格电子邀请函 1. 引言 随着人工智能技术的不断进步&#xff0c;图像风格迁移已从实验室走向大众化应用。在众多AI视觉项目中&#xff0c;AnimeGANv2 因其出色的二次元风格转换能力脱颖而出&#xff0c;成为“照片转动漫”领域最受欢迎的…

Keil uVision5安装教程:STM32烧录工具链配置指南

手把手搭建STM32开发环境&#xff1a;从Keil安装到程序烧录全流程实战 你是不是也曾遇到过这样的情况——兴冲冲下载了Keil&#xff0c;打开却发现编译器报错、ST-Link连不上、Flash算法找不到&#xff1f;明明代码写得没问题&#xff0c;可就是“下不去、跑不起来”。别急&am…

从普通刊到 SCI:paperxie 期刊论文功能,如何让学术投稿 “精准踩中期刊门槛”?

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/ai/journalArticleshttps://www.paperxie.cn/ai/journalArticles 对于科研人员和高校学生而言&#xff0c;“写期刊论文” 从来不是 “写完就行”—— 从普通期刊的 “格式…

WS2812B驱动程序PWM+DMA间接驱动方法:技术详解

用PWMDMA“驯服”WS2812B&#xff1a;如何让MCU一边点灯&#xff0c;一边干大事你有没有过这样的经历&#xff1f;想用STM32点亮一条炫酷的WS2812B灯带&#xff0c;写了个软件延时发数据&#xff0c;结果一跑FreeRTOS&#xff0c;LED就开始乱闪&#xff1b;或者控制几百颗灯珠时…

AnimeGANv2优化案例:提升动漫风格艺术感的技巧

AnimeGANv2优化案例&#xff1a;提升动漫风格艺术感的技巧 1. 背景与技术价值 随着深度学习在图像生成领域的快速发展&#xff0c;AI驱动的风格迁移技术逐渐从实验室走向大众应用。其中&#xff0c;AnimeGANv2 作为专为“照片转动漫”设计的轻量级生成对抗网络&#xff08;GA…

linux rhcsa

bash#!/bin/bash # 第一次作业echo " 1. 配置SSH服务 " # 启动并设置sshd开机自启 systemctl start sshd systemctl enable sshd > /dev/null 2>&1 # 临时关闭防火墙 systemctl stop firewalld systemctl disable firewalld > /dev/null 2>&1 # …

AnimeGANv2部署提速技巧:缓存机制与批处理实战优化

AnimeGANv2部署提速技巧&#xff1a;缓存机制与批处理实战优化 1. 引言 1.1 业务场景描述 在当前AI图像风格迁移应用中&#xff0c;AnimeGANv2 因其轻量、高效和高质量的二次元风格转换能力&#xff0c;广泛应用于社交娱乐、个性化头像生成等场景。尤其是在资源受限的边缘设…

对比评测:5大开源低代码平台开发效率实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个标准的CRM系统作为测试基准&#xff0c;功能包括&#xff1a;1. 客户信息管理 2. 销售机会跟踪 3. 任务日历 4. 基础报表。分别在Appsmith、ToolJet、Budibase、Supabase和…

【高可用系统必备技能】:掌握异步任务幂等性设计的7种经典方案

第一章&#xff1a;异步任务处理优化在高并发系统中&#xff0c;异步任务处理是提升响应速度与系统吞吐量的关键机制。通过将耗时操作&#xff08;如文件处理、邮件发送、第三方接口调用&#xff09;从主请求流程中剥离&#xff0c;系统能够快速返回响应&#xff0c;同时保障任…

VibeThinker-1.5B实战优化:小参数模型在生产环境的应用

VibeThinker-1.5B实战优化&#xff1a;小参数模型在生产环境的应用 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0c;支持一键部署…

基于Rembg的AI证件照制作:性能优化案例

基于Rembg的AI证件照制作&#xff1a;性能优化案例 1. 引言 1.1 AI 智能证件照制作工坊 在数字化办公与在线身份认证日益普及的今天&#xff0c;标准证件照已成为简历投递、考试报名、政务办理等场景中的刚需。传统方式依赖照相馆拍摄或手动使用Photoshop进行背景替换和裁剪…

小白也能懂:什么是DLL文件?常见错误解决方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个面向初学者的DLL问题指导应用&#xff0c;功能包括&#xff1a;1) 动画演示DLL文件的工作原理&#xff1b;2) 分步指导解决API-MS-WIN-CORE-LIBRARYLOADER-L1-2-0.DLL错误…

AnimeGANv2镜像部署优势:开箱即用,免环境配置

AnimeGANv2镜像部署优势&#xff1a;开箱即用&#xff0c;免环境配置 1. 引言 随着AI生成技术的快速发展&#xff0c;图像风格迁移已成为大众用户也能轻松体验的智能应用之一。其中&#xff0c;将真实照片转换为二次元动漫风格的需求尤为突出&#xff0c;广泛应用于社交头像、…

用AI快速开发QT教程应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个QT教程应用&#xff0c;利用快马平台的AI辅助功能&#xff0c;展示智能代码生成和优化。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 最近在做一个QT教程相关…

Stable Diffusion懒人方案:免安装网页版,2块钱随用随停

Stable Diffusion懒人方案&#xff1a;免安装网页版&#xff0c;2块钱随用随停 1. 为什么你需要这个懒人方案 作为一名插画师&#xff0c;你可能已经听说过Stable Diffusion这个强大的AI绘画工具。但传统的安装方式需要配置Python环境、下载几十GB的模型文件、调试各种参数—…

Vulkan图形编程入门:从零开始你的第一个三角形

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式Vulkan学习教程&#xff0c;分步骤引导用户完成开发环境配置、实例创建到最终渲染出第一个三角形的全过程。每个步骤提供可运行的代码片段、可视化解释和常见问题解…

零基础玩转VLA:5分钟搭建你的第一个视觉语言应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个极简VLA体验页面。功能&#xff1a;1) 拖拽上传图片 2) 显示AI生成的3种描述版本 3) 基础编辑功能 4) 分享按钮。使用预设的简单模型&#xff0c;界面要有引导提示和示例图…