Spring Security是Spring生態中的安全框架,用于管理Web應用的認證與權限控制,支持多種登錄方式并集成防護機制,可防范CSRF/XSS等攻擊,保障企業級系統的安全性。
一、核心功能與定位
-
身份認證(Authentication) 驗證用戶身份,支持多種認證方式:
-
表單登錄:傳統用戶名/密碼登錄。
-
OAuth2/JWT:適用于前后端分離或第三方登錄場景。
-
LDAP/HTTP Basic:集成企業目錄服務或簡單 API 認證。
-
-
授權(Authorization) 控制用戶訪問資源的權限:
-
基于角色(Role):如ADMIN、USER等粗粒度控制。
-
基于權限(Authority):細粒度控制(如read、write)。
-
方法級安全:通過@PreAuthorize注解動態校驗權限。
-
-
攻擊防護 內置防御常見 Web 攻擊:
-
CSRF(跨站請求偽造):自動生成并驗證 Token
-
會話固定攻擊:用戶登錄后重置 Session ID。
-
安全響應頭:自動添加X-Content-Type-Options等防護頭。
-
二、架構與核心設計
-
過濾器鏈(Filter Chain)
-
通過DelegatingFilterProxy攔截 HTTP 請求,由一系列安全過濾器(如UsernamePasswordAuthenticationFilter)處理認證、授權等邏輯。
-
典型流程:請求 → 認證過濾器 → 授權校驗 → 資源訪問。
-
-
核心組件
-
SecurityContextHolder
:存儲當前用戶的安全上下文(如認證信息)。 -
UserDetailsService
:加載用戶數據(如從數據庫或內存),返回UserDetails象。 -
AuthenticationManager
:協調認證流程,委托給DaoAuthenticationProvider等實現。
-
三、關鍵優勢
-
深度集成 Spring 生態
-
無縫兼容 Spring Boot、Spring MVC,支持自動配置(如默認啟用基礎安全規則)。
-
通過@EnableWebSecurity快速啟用安全模塊。
-
-
模塊化與可擴展性
-
支持按需擴展認證方式(如自定義UserDetailsService)。
-
提供 Servlet 應用(spring-security-web)和 Reactive 應用(spring-security-reactive)獨立模塊。
-
-
企業級安全實踐
-
遵循 縱深防御(Defense in Depth)原則,從網絡層到數據層多層防護。
-
支持 密碼加密(BCrypt/SCrypt)、HTTPS 強制、會話并發控制等。
-
四、典型應用場景
場景 | 技術方案 | 示例 |
---|---|---|
傳統 Web 應用 | 表單登錄 + 會話管理 | 后臺管理系統,基于角色控制菜單權限。 |
前后端分離架構 | JWT/OAuth2 + 無狀態配置 | RESTful API 使用 JWT 令牌認證,禁用 Session。 |
微服務安全 | Spring Cloud Security + OAuth2 授權服務器 | 微服務間通過令牌中繼(Token Relay)傳遞身份。 |
五、與 Shiro 的對比
特性 | Spring Security | Apache Shiro |
---|---|---|
集成 Spring | ? 深度無縫集成 | ?? 需手動適配 |
功能范圍 | 認證、授權、攻擊防護、會話管理全覆蓋 | 側重認證和授權,防護能力較弱 |
學習曲線 | 較陡峭(配置復雜) | 更簡單易用 |
適用規模 | 中大型企業級項目 | 中小型項目 |
六、典型案例展示
1.基礎Web應用安全(單體架構)
-
表單登錄+URL權限控制
-
場景:傳統后臺管理系統(如OA系統)
-
核心配置
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll() ?// 公開路徑.antMatchers("/admin/**").hasRole("ADMIN") ?// 管理員權限.anyRequest().authenticated() ?// 其他路徑需登錄.and().formLogin() ?// 啟用表單登錄.loginPage("/login") ?// 自定義登錄頁.permitAll();} }
-
特點:
-
默認生成登錄頁,支持自定義UI(Thymeleaf模板)
-
內存用戶認證(auth.inMemoryAuthentication())或數據庫用戶認證擴展
-
-
-
前后端分離架構(RESTful API安全)
-
JWT無狀態認證
-
場景:移動端/前端調用API接口
-
實現流程:
-
-
關鍵代碼:
// JWT過濾器
public class JwtFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = request.getHeader("Authorization");if (token != null) {Authentication auth = jwtUtil.parseToken(token); ?// 解析TokenSecurityContextHolder.getContext().setAuthentication(auth); ?// 注入安全上下文}chain.doFilter(request, response);}
}
-
配置要點:
-
禁用Session(
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
) -
開放登錄接口(.antMatchers("/auth/login").permitAll())
-
-
方法級注解控制
-
使用@PreAuthorize實現細粒度授權:
@RestController public class UserController {@GetMapping("/api/user/{id}")@PreAuthorize("hasAuthority('READ_USER')") ?// 需READ_USER權限public User getUser(@PathVariable Long id) { ... } }
-
-
微服務安全(OAuth2 + JWT)
-
OAuth2授權服務器
-
場景:多服務統一認證(如電商系統)
-
架構:
-
-
資源服務器配置:
@EnableResourceServer
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/**").authenticated(); ?// 保護API路徑}
}
3.自定義認證與數據庫集成
-
JDBC用戶認證服務
-
場景:從數據庫動態加載用戶權限
-
實現步驟:
-
創建用戶表(含
username
,password
,roles
字段) -
實現UserDetailsService接口:
@Service public class JdbcUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) {User user = userRepository.findByUsername(username);List<GrantedAuthority> authorities = user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).collect(Collectors.toList());return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);} }
-
配置密碼編碼器(推薦BCrypt):
@Bean public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(); }
-
-
六、總結
Spring Security 是 Spring 應用安全的基石,通過 模塊化設計 和 深度可定制性 滿足從單體應用到微服務的復雜需求。其核心價值在于:
-
標準化安全流程:提供認證、授權、防護的一站式解決方案;
-
企業級可靠性:內置最佳實踐(如 CSRF 防護、密碼加密);
-
生態整合優勢:與 Spring Boot、Spring Cloud 協同簡化配置。