基础内容
Spring Security框架介绍与使用教程
Spring Security 是 Spring 生态系统中的一个核心安全框架,专为保护基于 Spring 的应用程序而设计。它通过提供强大的认证(Authentication)和授权(Authorization)功能,以及防御常见攻击(如 CSRF、XSS 等),帮助开发者构建安全稳定的应用。下面我将从功能、入门教程和使用方法三个方面,逐步介绍 Spring Security,确保内容基于可靠参考来源。
一、Spring Security 的核心功能
Spring Security 的核心功能包括:
- 认证(Authentication):验证用户身份,例如通过用户名和密码登录。框架支持多种认证方式,如表单登录、HTTP 基本认证、OAuth2 等。
- 授权(Authorization):控制用户对资源的访问权限,例如基于角色(如 ADMIN、USER)或权限表达式限制访问特定 API 或页面。
- 安全防护:内置防御机制,如自动处理 CSRF(跨站请求伪造)攻击、会话固定攻击等,确保应用安全。
- 集成扩展:与 Spring Boot、Spring MVC 无缝集成,支持自定义配置和扩展,例如集成数据库或第三方认证服务。
这些功能使 Spring Security 成为企业级应用的首选安全解决方案,适用于 Web 应用、微服务等场景。
二、Spring Security 入门教程
以下是一个简单的 Spring Security 实现案例,基于 Spring Boot 项目。逐步操作即可上手:
-
导入依赖
在项目的pom.xml文件中添加 Spring Security 起步依赖,以及其他必要库(如 fastjson 用于 JSON 处理):<dependencies> <!-- Spring Security 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- 可选:JSON 处理工具 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> <!-- 使用最新版本 --> </dependency> <!-- Spring Web 支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>此依赖提供了快速设置 HTTP 基本认证或表单登录的能力。
-
配置 Spring Security
创建一个配置类(如SecurityConfig.java),定义认证和授权规则。以下示例启用表单登录,并设置简单权限:import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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 securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .requestMatchers("/public/**").permitAll() // 公开访问 .requestMatchers("/admin/**").hasRole("ADMIN") // 仅管理员可访问 .anyRequest().authenticated() // 其他请求需认证 ) .formLogin(form -> form .loginPage("/login") // 自定义登录页 .permitAll() ) .logout(logout -> logout .permitAll() ); return http.build(); } }此配置要求用户访问
/admin路径时必须有 ADMIN 角色,否则重定向到登录页。 -
创建访问资源
添加一个简单的控制器(如HomeController.java)来测试访问:import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/public/hello") public String publicHello() { return "public-page"; // 公开页面,无需登录 } @GetMapping("/admin/dashboard") public String adminDashboard() { return "admin-dashboard"; // 需 ADMIN 角色访问 } } -
测试身份验证和授权
运行项目后:- 访问
http://localhost:8080/public/hello可直接查看(无需登录)。 - 访问
http://localhost:8080/admin/dashboard会重定向到登录页(默认用户名user,密码在控制台生成)。 - 登录后,系统根据角色授权访问资源。
通过以上步骤,您已实现基本的认证和授权功能。Spring Security 会自动处理登录表单和会话管理。
- 访问
三、使用方法与最佳实践
- 自定义认证:集成数据库用户存储,例如通过
UserDetailsService接口加载用户信息。 - 高级授权:使用注解如
@PreAuthorize("hasRole('ADMIN')")在方法级控制权限。 - 安全优化:启用 HTTPS、配置密码加密(如 BCrypt)以增强安全性。
- 常见场景:适用于用户管理系统、API 网关、微服务架构等,确保数据隐私和合规性。
Spring Security 的学习曲线较陡,但通过官方文档和社区资源,您可以逐步掌握其高级功能。
思维导图

工作原理及相关源码示例
Spring Security 原理、源码结构与核心组件详解
一、原理与架构核心
Spring Security 的核心原理基于过滤器链(FilterChain) 机制,通过多层过滤器实现安全控制:
-
DelegatingFilterProxy
Spring 提供的代理过滤器,将 Servlet 容器的 Filter 请求委托给 Spring 管理的 Bean。在web.xml中配置:<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> -
FilterChainProxy
Spring Security 的核心过滤器,包含多个 SecurityFilterChain(如下图)。根据请求路径匹配对应的安全链: -
认证流程
典型认证流程(以用户名密码为例):
二、源码结构分析
核心模块组织(参考引用[2]):
spring-security
├── core # 核心接口(SecurityContext, Authentication)
├── web # 过滤器链实现(FilterChainProxy)
├── config # 注解和配置类(@EnableWebSecurity)
├── oauth2-core # OAuth2 协议支持
└── acl # 访问控制列表
关键包解析:
- org.springframework.security.core
包含Authentication,GrantedAuthority,UserDetails等核心接口 - org.springframework.security.web
过滤器实现:BasicAuthenticationFilter,CsrfFilter等 - org.springframework.security.config.annotation.web.builders
配置类:HttpSecurity,WebSecurity
三、常用注解
| 注解 | 作用 | 示例 |
|---|---|---|
@EnableWebSecurity | 启用Web安全配置 | @EnableWebSecurity(debug=true) |
@PreAuthorize | 方法级权限控制 | @PreAuthorize("hasRole('ADMIN')") |
@PostAuthorize | 方法执行后权限检查 | @PostAuthorize("returnObject.owner == authentication.name") |
@Secured | 基于角色的简单授权 | @Secured("ROLE_USER") |
@EnableGlobalMethodSecurity | 启用全局方法安全 | @EnableGlobalMethodSecurity(prePostEnabled=true) |
四、核心组件及其功能
-
AuthenticationManager
- 认证入口点,协调认证过程
- 默认实现:
ProviderManager(委托给多个AuthenticationProvider)
-
UserDetailsService
- 加载用户数据:
UserDetails loadUserByUsername(String username) - 常用实现:
InMemoryUserDetailsManager,JdbcUserDetailsManager
- 加载用户数据:
-
SecurityContextHolder
- 存储当前安全上下文(默认使用
ThreadLocal) - 获取当前用户:
SecurityContextHolder.getContext().getAuthentication()
- 存储当前安全上下文(默认使用
-
AccessDecisionManager
- 授权决策核心,基于投票机制
- 实现类:
AffirmativeBased(一票通过即授权)
-
Filter 组件
过滤器 功能 UsernamePasswordAuthenticationFilter处理表单登录 BasicAuthenticationFilter处理HTTP基本认证 CsrfFilter防御CSRF攻击(默认启用) AnonymousAuthenticationFilter为未认证请求创建匿名用户
五、示例代码
- 自定义认证逻辑
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
// 自定义用户存储(数据库/LDAP等)
return username -> {
if ("admin".equals(username)) {
return User.withUsername("admin")
.password("{bcrypt}$2a$10$...")
.roles("ADMIN")
.build();
}
throw new UsernameNotFoundException("用户不存在");
};
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}
- 方法级权限控制
@RestController
public class AdminController {
@GetMapping("/admin/data")
@PreAuthorize("hasAuthority('READ_PRIVILEGE')")
public ResponseEntity<String> getAdminData() {
return ResponseEntity.ok("敏感数据");
}
}
- 自定义认证提供器
@Component
public class CustomAuthProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication auth) {
String name = auth.getName();
String password = auth.getCredentials().toString();
if (customValidation(name, password)) {
return new UsernamePasswordAuthenticationToken(name, password,
List.of(new SimpleGrantedAuthority("ROLE_USER")));
}
throw new BadCredentialsException("认证失败");
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
六、安全防护机制
-
CSRF 防御
- 默认启用,通过
CsrfFilter验证X-CSRF-TOKEN - 禁用方法:
http.csrf().disable()
- 默认启用,通过
-
XSS 防御
- 通过内容安全策略(CSP)响应头实现:
http.headers(headers -> headers .contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'")) );
提示:Spring Security 6 开始默认启用更严格的安全策略,如要求 CSRF Token 匹配。
思维导图

828

被折叠的 条评论
为什么被折叠?



