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

【Java后端】深入理解 Spring Security:从原理到实战

深入理解 Spring Security:从原理到实战

在现代 Web 应用中,安全性 是后端开发中不可忽视的核心环节。Spring Security 作为 Spring 全家桶中的安全框架,提供了认证(Authentication)和授权(Authorization)的全套解决方案,并且具有高度的可扩展性。本文将从 基本概念、核心原理、典型流程和实战案例 四个方面,深入理解 Spring Security。


一、Spring Security 是什么?

Spring Security 是基于 Spring 的安全框架,主要解决两个问题:

  1. 认证(Authentication)
    判断用户是谁,例如登录验证。

  2. 授权(Authorization)
    判断用户能做什么,例如不同角色访问不同接口。

同时,Spring Security 还提供:

  • 防止 CSRF 攻击

  • 基于会话 / Token / JWT 的认证

  • 与 OAuth2、LDAP 等集成

  • 细粒度方法级别权限控制


二、Spring Security 的核心架构

Spring Security 底层基于 Servlet 过滤器链 实现,每个请求都会经过一系列过滤器进行处理。

2.1 核心组件

  • SecurityContextHolder
    保存当前请求的安全上下文,包含用户信息和权限。

  • Authentication
    用户认证信息对象,保存用户名、密码、权限等。

  • UserDetailsService
    提供加载用户数据的服务,通常通过数据库查询用户信息。

  • PasswordEncoder
    密码加密与验证工具,如 BCryptPasswordEncoder

  • AuthenticationManager
    核心认证管理器,调用多个 AuthenticationProvider 完成认证。

  • AccessDecisionManager
    负责权限决策,判断用户是否有访问某资源的权限。


三、Spring Security 的执行流程

一个典型的基于表单登录的认证流程如下:


四、Spring Security 快速上手

下面给出一个最小可运行的 Spring Boot + Spring Security 示例。

4.1 添加依赖

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

4.2 配置类

Spring Boot 3.x 之后推荐使用 SecurityFilterChain 代替 WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭 CSRF(仅开发环境).authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll() // 放行接口.anyRequest().authenticated()             // 其他接口需要认证).formLogin(Customizer.withDefaults()); // 默认表单登录return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails user = User.builder().username("admin").password(passwordEncoder().encode("123456")).roles("ADMIN").build();return new InMemoryUserDetailsManager(user);}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

此时访问 http://localhost:8080 时,除 /public/** 接口外,其余都需要登录。


五、基于 JWT 的无状态认证(进阶)

在实际开发中,前后端分离项目通常不会使用 Session,而是用 JWT(JSON Web Token) 来存储用户身份。

流程如下:

  1. 用户登录成功后,后端生成 JWT 并返回给前端。

  2. 前端将 JWT 保存到 localStoragecookie

  3. 每次请求时,前端在 Authorization: Bearer <token> 头中携带 JWT。

  4. 后端过滤器验证 JWT 是否有效,决定是否放行请求。

示例过滤器:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Autowiredprivate JwtUtils jwtUtils;@Autowiredprivate UserDetailsService userDetailsService;@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain) throws IOException, ServletException {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);String username = jwtUtils.extractUsername(token);if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {UserDetails userDetails = userDetailsService.loadUserByUsername(username);if (jwtUtils.validateToken(token, userDetails)) {UsernamePasswordAuthenticationToken auth =new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(auth);}}}filterChain.doFilter(request, response);}
}

在配置类中添加:

http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

这样就能实现 前后端分离、无状态认证 的效果。


六、方法级别权限控制

除了接口级权限控制,Spring Security 还支持 方法级别 的权限校验:

  1. 开启注解支持

@EnableMethodSecurity
public class MethodSecurityConfig {
}
  1. 在业务方法上使用注解

@Service
public class UserService {@PreAuthorize("hasRole('ADMIN')")public void deleteUser(Long id) {// 仅 ADMIN 角色可执行}
}

七、总结

Spring Security 虽然一开始上手有些复杂,但它的 过滤器链机制认证授权模型可扩展性 非常强大。

  • 小项目可直接用 表单登录 + Session

  • 前后端分离项目推荐使用 JWT

  • 企业级项目可以扩展 OAuth2 / SSO / 自定义认证

Spring Security,不仅要会用,更要理解它的 认证与授权核心流程,这样才能在复杂业务场景下灵活扩展。

http://www.dtcms.com/a/392980.html

相关文章:

  • LeetCode:31.K个一组翻转链表
  • openharmony之系统亮度范围定制
  • 一种利用串口51单片机远程升级 OTA
  • Redis三种集群模式
  • C++ map_set封装
  • NW836NW884美光固态闪存NW885NW913
  • STM32计算步进电机转速
  • liboffice 全屏禁用工具栏
  • Photoshop - Photoshop 调整图像品质
  • 【CF】Day146——杂题 (递归 | 规律与操作)
  • PyTorch 中特征变换:卷积与转置卷积
  • HashMap底层原理详解:扩容、红黑树与ConcurrentHashMap的线程安全
  • autodl文件存储,文件同步,conda环境同步问题
  • 【ROS2】Begginer : CLI tools - 理解 ROS 2 话题
  • Java网络编程:从基础到实战
  • 面试MYSQL的索引类型、索引的工作原理、以及索引优化策略
  • 一、Pytorch安装教程-windows环境,利用Anaconda搭建虚拟环境,Pycharm开发工具
  • JWT登录校验
  • 对症下药:电商、B2B、本地服务和内容媒体的GEO定制化策略
  • 分类预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络多特征分类预测
  • pcl封装11 (快速定义)旋转矩阵
  • Windows 系统中如何通过 Docker 调用 CUDA 和 cuDNN 加速大模型推理
  • 从零编写vue3系统--5步教学
  • 嵌入式Linux C语言程序设计三
  • 【记录】初赛复习 Day5 6(2021S第一轮错题,内附深井题目讲解)
  • 【C++】类和对象—(下) 收官之战
  • 人工智能学习:什么是迁移学习
  • 模型进阶与神经网络
  • 微软.NET离线运行库合集 v2025.09.09_Win中文_NET运行库_安装教程
  • Galileo AI-AI驱动的UI界面设计工具