干安全的Security框架还不懂就得小心了,面试官一问你怎么防护呢?你咋说,你要是上来给他催一波Security框架防护技巧,估计面试官对你刮目想看。
关于Java安全的代码审计已经更新,对应的面试题也已经更新了。看文末获取把。
4万多字的Java代码审计已更新到我们星球,如果你想在面试中卷过别人,代码审计肯定是不能少的,相关面试题目也已经更新到星球了,下面这张图是代码审计系列的,文字类已更新到星球,需要的看文末
4万字的Java代码审计----文末有彩蛋
1. 框架介绍
Spring Security 是 Spring 生态系统中的 安全框架,专注于为 Java 应用提供 认证(Authentication) 和 授权(Authorization) 功能。
-
核心目标:保护应用免受未授权访问、数据泄露及常见安全攻击(如 CSRF、XSS、会话固定等)。 -
底层原理:基于 Servlet 过滤器(Filter)链,通过拦截请求并应用安全规则,实现细粒度的访问控制。 -
关键特点: -
模块化设计,可灵活扩展。 -
支持多种认证方式(表单、OAuth2、JWT、LDAP 等)。 -
深度集成 Spring 生态(如 Spring Boot、Spring MVC)。
2. 核心功能
(1) 认证(Authentication)
-
功能:验证用户身份(如用户名密码、社交登录)。 -
实现方式: -
内存认证:直接在配置中定义用户(测试用)。 @Bean
public UserDetailsService users(){
UserDetails user = User.builder()
.username("user")
.password("{bcrypt}$2a$10$...")
.roles("USER")
.build();
returnnew InMemoryUserDetailsManager(user);
} -
数据库认证:通过 UserDetailsService
从数据库加载用户。 -
OAuth2/第三方登录:集成 Google、GitHub 等第三方认证。
(2) 授权(Authorization)
-
功能:控制用户对资源的访问权限(如 URL、方法、数据)。 -
实现方式: -
基于角色的访问控制(RBAC): http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated(); -
基于表达式的细粒度控制:使用 SpEL 表达式。 @PreAuthorize("hasRole('ADMIN') or #userId == authentication.name")
publicvoiddeleteUser(String userId){ ... }
(3) 安全防护
-
CSRF 防护:默认启用,通过 Token 验证防止跨站请求伪造。 -
Session 管理:支持会话固定保护、并发控制。 -
HTTP 安全头:自动添加 X-Content-Type-Options
、Strict-Transport-Security
等头。
3. 应用场景
(1) Web 应用安全
-
用户登录/登出:支持表单登录、记住我(Remember-Me)功能。 -
权限分级:按角色(ROLE_ADMIN)或权限(PERMISSION_DELETE)限制访问。 -
REST API 保护:集成 JWT 或 OAuth2 实现无状态认证。
(2) 微服务安全
-
OAuth2 资源服务器:通过 @EnableResourceServer
保护微服务 API。 -
JWT 验证:使用公钥验证 Token 合法性。 @Bean
public JwtDecoder jwtDecoder(){
return NimbusJwtDecoder.withPublicKey(publicKey).build();
}
(3) 企业级集成
-
LDAP/Active Directory:对接企业目录服务。 -
SAML 2.0:实现单点登录(SSO)。
4. 架构与核心组件
(1) 过滤器链(Filter Chain)
Spring Security 通过一系列过滤器处理请求,核心过滤器包括:
-
SecurityContextPersistenceFilter:存储安全上下文(SecurityContext)。 -
UsernamePasswordAuthenticationFilter:处理表单登录。 -
FilterSecurityInterceptor:最终决定是否允许访问。
(2) 核心接口
-
** UserDetailsService
**:加载用户信息(需自定义实现对接数据库)。 -
** AuthenticationProvider
**:自定义认证逻辑(如短信验证码)。 -
** AccessDecisionManager
**:决定用户是否有权访问资源。
(3) 安全上下文(SecurityContext)
-
存储当前用户的认证信息( Authentication
对象),通过SecurityContextHolder
获取:Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
5. 与其他框架的集成
(1) Spring Boot
-
自动配置:只需添加依赖 spring-boot-starter-security
,自动启用基础安全配置。 -
自定义配置:通过 SecurityFilterChain
Bean 覆盖默认行为。@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeRequests(auth -> auth.anyRequest().authenticated())
.formLogin(withDefaults());
return http.build();
}
(2) OAuth2
-
客户端模式:快速集成第三方登录(如 GitHub)。 spring:
security:
oauth2:
client:
registration:
github:
client-id:your-client-id
client-secret:your-secret -
资源服务器模式:保护自有 API。 @EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
publicclassResourceServerConfigextendsWebSecurityConfigurerAdapter{
@Override
protectedvoidconfigure(HttpSecurity http)throws Exception {
http.oauth2ResourceServer().jwt();
}
}
(3) JWT(JSON Web Token)
-
生成 Token:用户登录后返回 JWT。 String token = Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 864000000))
.signWith(SignatureAlgorithm.HS512, "secret-key")
.compact(); -
验证 Token:通过过滤器解析并验证 JWT。
6. 最佳实践与常见问题
(1) 密码加密
-
强制使用强哈希算法(如 BCrypt): @Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
(2) 权限设计
-
最小权限原则:用户仅拥有完成操作所需的最小权限。 -
分层角色:使用角色继承简化管理。 http.authorizeRequests()
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')");
(3) 常见问题
-
CSRF 防护导致 POST 请求失败:前端需携带 _csrf
Token。 -
静态资源被拦截:配置忽略规则。 web.ignoring().antMatchers("/css/**", "/js/**");
要知道他的用户哦!!!
Spring Security 是 Java 领域最成熟的安全框架,适用于:
-
需要精细权限控制的 Web 应用。 -
微服务架构中的 API 安全保护。 -
企业级身份认证(LDAP、SAML)。
星球介绍
一个人走的很快,但一群人才能地的更远。吉祥同学学安全这个星球🔗成立了1年左右,已经有300+的小伙伴了,如果你是网络安全的学生、想转行网络安全行业、需要网安相关的方案、ppt,戳链接🔗(内有优惠卷)快加入我们吧。系统性的知识库已经有:《Java代码审计》++《Web安全》++《应急响应》++《护网资料库》++《网安面试指南》
原文始发于微信公众号(吉祥讲安全):这篇有点硬 详解 Spring Security 框架
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论