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

Spring Security 2026 最佳实践:构建安全可靠的应用系统

Spring Security 2026 最佳实践构建安全可靠的应用系统别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。在当今复杂的网络环境中应用安全已经成为开发过程中不可或缺的一部分。Spring Security 作为 Spring 生态中处理安全问题的核心组件一直致力于提供强大而灵活的安全解决方案。随着 Spring Security 2026 的发布它带来了许多新特性和改进。今天我想和大家分享一下 Spring Security 2026 的最佳实践帮助大家构建更安全、更可靠的应用系统。二、Spring Security 2026 新特性1. 增强的 OAuth 2.1 支持Spring Security 2026 全面支持 OAuth 2.1 协议简化的配置更简洁的 OAuth 2.1 配置方式增强的 token 管理更安全的 token 存储和验证支持 OIDC 1.0完整的 OpenID Connect 1.0 支持2. 虚拟线程集成Configuration public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize - authorize .requestMatchers(/public/**).permitAll() .anyRequest().authenticated() ) .oauth2Login(withDefaults()) .sessionManagement(session - session .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) ); return http.build(); } }3. 安全性增强更强大的密码编码器默认使用 Argon2PasswordEncoder增强的 CSRF 防护更智能的 CSRF 令牌管理安全 headers 自动配置默认启用更安全的 HTTP 头三、核心最佳实践1. 认证管理基于 OAuth 2.1 的认证Configuration public class OAuth2ClientConfig { Bean public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository( ClientRegistration.withRegistrationId(github) .clientId(your-client-id) .clientSecret(your-client-secret) .redirectUri({baseUrl}/login/oauth2/code/{registrationId}) .authorizationUri(https://github.com/login/oauth/authorize) .tokenUri(https://github.com/login/oauth/access_token) .userInfoUri(https://api.github.com/user) .userNameAttributeName(IdTokenClaimNames.SUB) .clientName(GitHub) .build() ); } }自定义认证逻辑Service public class CustomUserDetailsService implements UserDetailsService { Autowired private UserRepository userRepository; Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user userRepository.findByUsername(username) .orElseThrow(() - new UsernameNotFoundException(User not found: username)); return User.builder() .username(user.getUsername()) .password(user.getPassword()) .authorities(user.getRoles().stream() .map(role - new SimpleGrantedAuthority(ROLE_ role.getName())) .collect(Collectors.toList())) .accountExpired(false) .accountLocked(false) .credentialsExpired(false) .enabled(true) .build(); } }2. 授权管理基于角色的访问控制Configuration public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize - authorize .requestMatchers(/admin/**).hasRole(ADMIN) .requestMatchers(/user/**).hasAnyRole(USER, ADMIN) .anyRequest().permitAll() ); return http.build(); } }基于权限的访问控制PreAuthorize(hasPermission(#order, READ)) public Order getOrder(Long id) { return orderRepository.findById(id).orElse(null); } PreAuthorize(hasPermission(#order, WRITE)) public Order updateOrder(Order order) { return orderRepository.save(order); }基于表达式的访问控制PreAuthorize(#userId authentication.principal.id or hasRole(ADMIN)) public User getUser(Long userId) { return userRepository.findById(userId).orElse(null); }3. 安全防护CSRF 防护Configuration public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf - csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringRequestMatchers(/api/**) ); return http.build(); } }XSS 防护Configuration public class WebConfig implements WebMvcConfigurer { Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new XssInterceptor()); } } public class XssInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // XSS 防护逻辑 return true; } }CORS 配置Configuration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.setAllowedOrigins(List.of(*)); config.setAllowedMethods(List.of(GET, POST, PUT, DELETE, OPTIONS)); config.setAllowedHeaders(List.of(*)); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }四、高级特性1. 会话管理会话配置Configuration public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .sessionManagement(session - session .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(1) .expiredUrl(/login?expired) .sessionRegistry(sessionRegistry()) ); return http.build(); } Bean public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } }会话并发控制Service public class SessionService { Autowired private SessionRegistry sessionRegistry; public void invalidateUserSessions(String username) { ListSessionInformation sessions sessionRegistry.getAllSessions( username, false); for (SessionInformation session : sessions) { session.expireNow(); } } }2. 安全事件自定义安全事件监听Component public class AuthenticationEventListener { EventListener public void handleAuthenticationSuccess(AuthenticationSuccessEvent event) { // 处理认证成功事件 Authentication authentication event.getAuthentication(); String username authentication.getName(); System.out.println(User username logged in successfully); } EventListener public void handleAuthenticationFailure(AuthenticationFailureBadCredentialsEvent event) { // 处理认证失败事件 String username event.getAuthentication().getName(); System.out.println(User username failed to log in); } }3. 安全日志安全日志配置logging: level: org.springframework.security: DEBUG spring: security: oauth2: client: registration: github: client-id: ${GITHUB_CLIENT_ID} client-secret: ${GITHUB_CLIENT_SECRET}五、生产环境配置1. 密钥管理使用环境变量spring: security: oauth2: client: registration: github: client-id: ${GITHUB_CLIENT_ID} client-secret: ${GITHUB_CLIENT_SECRET}使用密钥库Configuration public class JwtConfig { Bean public KeyPair keyPair() { try { KeyStore keyStore KeyStore.getInstance(JKS); keyStore.load(new FileInputStream(keystore.jks), password.toCharArray()); PrivateKey privateKey (PrivateKey) keyStore.getKey(jwt, password.toCharArray()); PublicKey publicKey keyStore.getCertificate(jwt).getPublicKey(); return new KeyPair(publicKey, privateKey); } catch (Exception e) { throw new RuntimeException(e); } } }2. 安全监控集成 Actuatormanagement: endpoints: web: exposure: include: health,info,metrics,prometheus,security security: enabled: true安全审计Configuration EnableAuditing public class AuditConfig { Bean public AuditorAwareString auditorAware() { return () - Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) .map(Authentication::getName); } }六、常见问题与解决方案1. 密码安全问题密码存储不安全解决方案使用 Argon2PasswordEncoder定期更新密码启用多因素认证2. 授权绕过问题权限控制不严格导致授权绕过解决方案使用基于表达式的访问控制定期进行安全审计实现细粒度的权限检查3. 会话固定问题会话固定攻击解决方案启用会话重生成使用 HttpSessionIdResolver合理设置会话超时七、实战案例案例企业级应用安全架构需求支持多种认证方式用户名密码、OAuth 2.0、SAML细粒度的权限控制安全审计和监控高可用性实现Configuration public class SecurityConfig { Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize - authorize .requestMatchers(/public/**).permitAll() .requestMatchers(/api/**).authenticated() .requestMatchers(/admin/**).hasRole(ADMIN) .anyRequest().authenticated() ) .formLogin(form - form .loginPage(/login) .permitAll() ) .oauth2Login(withDefaults()) .saml2Login(withDefaults()) .logout(logout - logout .logoutSuccessUrl(/login?logout) .permitAll() ) .sessionManagement(session - session .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(1) ) .csrf(csrf - csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) ); return http.build(); } }八、总结Spring Security 2026 为我们提供了更强大、更灵活的安全解决方案。通过合理的配置和最佳实践我们可以构建出既安全又可靠的应用系统。这其实可以更优雅一点。希望这篇文章能帮助大家更好地使用 Spring Security 2026。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

相关文章:

Spring Security 2026 最佳实践:构建安全可靠的应用系统

Spring Security 2026 最佳实践:构建安全可靠的应用系统别叫我大神,叫我 Alex 就好。一、引言 大家好,我是 Alex。在当今复杂的网络环境中,应用安全已经成为开发过程中不可或缺的一部分。Spring Security 作为 Spring 生态中处理安…...

SEO网络推广技术需要长期投入吗

SEO网络推广技术的长期投入:你真的需要吗? 在互联网时代,SEO(搜索引擎优化)网络推广技术已经成为企业提升在线存在感和吸引流量的重要手段。有不少企业在初期推广时常常会犹豫是否需要长期投入SEO,担心这是…...

kmp算法:我们所忽略的字符串匹配本质

一、先捅破窗户纸:前后缀在匹配里到底起什么作用?在讲next数组的计算之前,我们必须先把“为什么有前后缀,就能不回退主串”这个核心逻辑彻底讲透,这是字符串匹配的本质核心。我们用一个有前后缀的经典案例,…...

在树莓派上运行本地 LLM 和 VLM

原文:towardsdatascience.com/running-local-llms-and-vlms-on-the-raspberry-pi-57bd0059c41a?sourcecollection_archive---------0-----------------------#2024-01-14 在树莓派上使用 Ollama 本地运行 Phi-2、Mistral 和 LLaVA 等模型 https://medium.com/pyes…...

利用计算机视觉进行跑步效率分析:与埃利乌德·基普乔格的比较分析

原文:towardsdatascience.com/running-efficiency-with-computer-vision-a-comparative-analysis-with-eliud-kipchoge-736eb80c574f 如何利用计算机视觉提高跑步效率? https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/…...

无代码玩法:OpenClaw网页控制台配合Qwen3.5-9B处理电商截图

无代码玩法:OpenClaw网页控制台配合Qwen3.5-9B处理电商截图 1. 为什么选择OpenClaw处理电商截图 作为一个经常网购的技术爱好者,我发现自己经常需要手动整理不同平台的商品价格信息。传统的做法是截图后人工录入Excel,既耗时又容易出错。直…...

UPnP_Generic库:嵌入式设备自动端口映射实战指南

1. UPnP_Generic库深度技术解析:嵌入式设备自动端口映射的工程实践1.1 为什么嵌入式开发者需要UPnP_Generic库在嵌入式物联网项目中,当设备需要从公网访问本地Web服务(如传感器数据页面、远程控制接口或OTA升级服务器)时&#xff…...

OpenClaw会议纪要助手:Qwen3-14b_int4_awq转写与重点提炼

OpenClaw会议纪要助手:Qwen3-14b_int4_awq转写与重点提炼 1. 为什么需要自动化会议纪要 作为远程工作者,我每周要参加至少15场跨时区会议。过去手动整理纪要时经常遇到三个痛点:一是录音转文字耗时(1小时会议需要2小时整理&…...

OpenClaw长期运行优化:Qwen3.5-9B-AWQ-4bit内存泄漏排查

OpenClaw长期运行优化:Qwen3.5-9B-AWQ-4bit内存泄漏排查 1. 问题背景与现象描述 上周我的OpenClaw网关服务在连续运行72小时后突然崩溃,导致自动化任务全部中断。查看系统监控发现内存占用从初始的2GB逐渐增长到16GB(我的服务器总内存&…...

ssh进阶用法

ssh登录与ssh配置文件 使用ssh可以从一台设备登录到另一台已开启sshd服务的远程设备。 Ubuntu-22.04 coliDESKTOP-J45M1NUM:~$ ssh yukari172.28.24.152 The authenticity of host 172.28.24.152 (172.28.24.152) cant be established. ECDSA key fingerprint is SHA256:YSC…...

基于WebAssembly的Harness扩展机制

基于WebAssembly的Harness扩展机制:构建灵活、安全且高性能的CI/CD生态系统 一、引言 钩子 (The Hook) 想象一下这个场景:您正在使用Harness构建您的CI/CD流水线,但您需要一个特定的功能——也许是一个专有的代码扫描工具,或者是与您内部系统集成的自定义步骤。传统上,…...

AI Agent Harness Engineering 的记忆架构:短期、长期与情景记忆的工程实现

AI Agent Harness Engineering 的记忆架构:短期、长期与情景记忆的工程实现 副标题:构建具有类人记忆能力的智能代理系统完整指南 第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 (Compelling Title) “AI Agent Harness Engineering 的记忆架构…...

多核通信中的环形缓冲区设计与实现

1. 核间通信与环形缓冲区基础在现代多核处理器系统中,核间通信(IPC)是实现并行计算和任务协同的关键技术。共享内存是最常用的核间通信方式之一,它允许多个处理器核心通过访问同一块物理内存区域来交换数据。这种方式的优势在于避免了数据拷贝&#xff0…...

TLT库:面向Arduino的Telit ME310G1蜂窝通信轻量级C++ SDK

1. 项目概述TLT(Telit Library for Arduino)是一个面向嵌入式蜂窝通信的轻量级C库,专为CodeZoo ME310G1 Telit模块在Arduino平台上的集成而设计。该库并非从零构建,而是基于Arduino官方MKRNB库(arduino-libraries/MKRN…...

M5Unit-DigiClock模块:基于I²C的即插即用数字时钟解决方案

1. 项目概述 M5Unit-DigiClock(SKU: U146)是 M5Stack 推出的一款紧凑型数字时钟单元模块,专为 M5Stack Core 系列主控(如 Core2、CoreS3、Atom Echo)及兼容 ESP32 系列 MCU 的开发板设计。该模块并非通用 RTC 芯片的简…...

企业SEO优化与网站内容建设的关系是什么

企业SEO优化与网站内容建设的关系是什么 在现代数字营销中,企业SEO优化与网站内容建设是两个密不可分的重要环节。SEO优化(Search Engine Optimization)旨在提升网站在搜索引擎中的排名,而网站内容建设则是展示和传递企业信息的基…...

主流开源协议解析与选择指南

1. 开源协议:程序员必须掌握的法律常识第一次在GitHub上创建仓库时,面对那一长串开源协议选项,我和大多数新手一样直接懵了。MIT、Apache、GPL...这些看似简单的缩写背后,实则隐藏着影响深远的法律约束。作为从业十年的开发者&…...

OpenClaw多模型切换指南:Qwen3-4B与本地LLM混合调用

OpenClaw多模型切换指南:Qwen3-4B与本地LLM混合调用 1. 为什么需要多模型混合调用 去年冬天,当我第一次尝试用OpenClaw自动化处理技术文档时,发现一个尴尬的现象:用Qwen3-4B生成代码示例效果很好,但让它润色一段产品…...

Linux 的 link 命令

Linux 中的 link 命令用于创建硬链接(hard link),这是 Linux/Unix 文件系统中的一种特殊文件连接方式。与符号链接(symbolic link)不同,硬链接直接指向文件的 inode,而不是通过路径名引用。 命…...

Linux 的 df 命令

df (disk free) 命令是 Linux 系统中用于显示文件系统磁盘空间使用情况的常用工具。它可以报告文件系统的总容量、已用空间、可用空间以及挂载点等信息。 基本语法 df [选项] [文件或目录]常用选项 -h 或 --human-readable 以易读格式显示大小(KB, MB, GB&#xf…...

OpenClaw开源贡献:为Qwen3-4B开发新技能并提交社区

OpenClaw开源贡献:为Qwen3-4B开发新技能并提交社区 1. 为什么我们需要更多社区贡献的技能 去年冬天,当我第一次尝试用OpenClaw自动化处理每周的Markdown文档整理时,发现现有的技能库缺少一个能批量处理Front Matter的工具。这个痛点让我意识…...

RTOS在嵌入式开发中的核心价值与实战应用

1. RTOS在嵌入式开发中的核心价值我第一次接触RTOS是在2015年开发工业控制器时遇到的困境。当时用裸机编程实现多任务调度,代码已经膨胀到难以维护的程度。一个简单的功能修改需要通读上万行代码,调试一个BUG经常引发连锁反应。直到引入RTOS后&#xff0…...

OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并行处理极限

OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并行处理极限 1. 测试背景与动机 最近在折腾本地AI自动化时,遇到一个实际问题:当OpenClaw同时处理多个任务时,显存会成为瓶颈吗?我手头正好有台配备RTX4090D(…...

第23章 2014真题作文

目录 题目2014.11-论软件需求管理 题目2014.11-论非功能性需求对企业应用架构设计的影响 题目2014.11-论软件的可靠性设计 题目2014.11-论网络安全体系设计 题目2014.11-论软件需求管理 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互…...

第22章 2013真题作文

目录 题目2013.11-论软件架构建模技术与应用 题目2013.11-企业应用系统的分层架构风格 题目2013.11-论软件可靠性设计技术的应用 题目2013.11-分布式存储系统架构设计 题目2013.11-论软件架构建模技术与应用 软件架构用来处理软件高层次结构的设计和实施,它以精…...

如何利用地理位置信息优化网站的本地SEO效果

如何利用地理位置信息优化网站的本地SEO效果 在当今数字化时代,网站的本地SEO(搜索引擎优化)效果直接影响着网站的流量和用户转化率。利用地理位置信息进行本地SEO优化,不仅能够提升网站在本地用户中的可见性,还能有效…...

【复现】基于Lyapunov非线性控制-模型预测控制(LMPC)与反步法+自主水下航行器(AUV)的轨迹跟踪控制研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Linux内核模块加载机制深度解析

1. Linux内核模块加载机制深度解析在Linux系统开发中,内核模块的动态加载机制为开发者提供了极大的灵活性。作为一名长期从事内核开发的工程师,我经常需要深入理解模块加载的完整流程,这对调试复杂驱动问题和性能优化至关重要。本文将以linux…...

MacOS极简部署OpenClaw:Phi-3-mini-128k-instruct镜像快速体验

MacOS极简部署OpenClaw:Phi-3-mini-128k-instruct镜像快速体验 1. 为什么选择这个组合? 上周我在测试各种开源模型时,偶然发现了Phi-3-mini-128k-instruct这个轻量级模型。它的响应速度和对指令的理解能力让我印象深刻,特别是12…...

Arduino控制乐歌/升谱电动升降桌的UART物联网方案

1. 项目概述LoctekMotion_IoT_arduino 是一个面向 Loctek Motion(国内常称“乐歌”)与 FlexiSpot(国内常称“升谱”)品牌电动升降桌的开源 Arduino 控制库,核心目标是将传统电动升降桌改造为具备物联网能力的智能办公终…...