2. 编程语言-JAVA-Spring Security
文章目录
- 前言
- 一、spring-security-oauth2
- 二、spring-security-jwt
前言
Spring Security
- spring-security-oauth2
- spring-security-jwt
一、spring-security-oauth2
- 各版本的名称及发布日期:
版本 | 适用 Spring Boot | 适用 Spring Security | 状态 | 备注 |
---|---|---|---|---|
2.5.x | 2.5.x - 2.7.x | 5.5.x - 5.7.x | 维护中 | 推荐稳定版 |
2.4.x | 2.4.x - 2.6.x | 5.4.x - 5.6.x | 已弃用 | 建议升级 |
2.3.x | 2.3.x - 2.5.x | 5.3.x - 5.5.x | 已弃用 | 不推荐 |
2.2.x | 2.2.x - 2.4.x | 5.2.x - 5.4.x | 已弃用 | 仅旧项目 |
2.1.x | 2.1.x - 2.3.x | 5.1.x - 5.3.x | 已弃用 | 不推荐 |
- Spring Boot 2.7.x + JDK 8的环境推荐版本
<dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId><version>2.5.2.RELEASE</version> <!-- 最新稳定版 -->
</dependency>
- Spring Security 版本匹配
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>5.7.6</version> <!-- 推荐版本 -->
</dependency>
- 注意事项
-
Spring Security OAuth2 已弃用
- 官方推荐迁移到 Spring Authorization Server(Spring Security 5.7+ 内置)
- 新项目建议直接使用 spring-security-oauth2-authorization-server(Spring Boot 3.x+)
-
JDK 8 兼容性
- Spring Security OAuth2 2.5.x 仍支持 JDK 8
- 如需升级到 Spring Boot 3.x,需切换至 JDK 17+
-
常见问题
- 如果遇到 NoSuchMethodError,检查依赖冲突(如旧版 spring-security-jwt)
- 推荐使用 spring-security-oauth2-autoconfigure 简化配置
- 迁移建议
如果计划升级,可参考以下路径:
- 短期方案:继续使用 OAuth2 2.5.x(维护模式)
- 长期方案:迁移到 Spring Authorization Server(需要 Spring Boot 3.x+)
- Spring Authorization Server
二、spring-security-jwt
-
版本选择
spring-security-jwt 最终稳定版:
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-jwt</artifactId><version>1.1.1.RELEASE</version> <!-- 官方最后维护版本 --></dependency>
- 兼容性说明:
- 需搭配 spring-security-oauth2 2.5.x 使用(如 2.5.2.RELEASE)。
- 不支持 Spring Boot 3.x 或 JDK 17+。
2. 基础配置示例
- JWT 密钥配置
JwtConfig.java
@Configuration
public class JwtConfig {@Value("${jwt.secret}")private String secret;@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey(secret); // 设置签名密钥return converter;}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(jwtAccessTokenConverter());}
}
-
需在 application.properties 中配置 jwt.secret=your-256-bit-secret。
-
OAuth2 资源服务器配置
ResourceServerConfig.java
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/api/public/**").permitAll().anyRequest().authenticated();}
}
3. 生成和解析 JWT 令牌
- 生成令牌(授权服务器端)
JwtTokenEnhancer.java
class JwtTokenEnhancer implements TokenEnhancer {@Overridepublic OAuth2AccessToken enhance(OAuth2AccessToken accessToken,OAuth2Authentication authentication) {Map<String, Object> additionalInfo = new HashMap<>();additionalInfo.put("organization", "example-org");((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);return accessToken;}
}
- 解析令牌(资源服务器端)
JwtUtils.java
class JwtUtils {public static Claims extractClaims(String token, String secret) {return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody();}
}
4. 注意事项
- 密钥安全:
- 替换 JwtAccessTokenConverter 的签名逻辑)。
- 依赖冲突:
- 避免引入 jjwt 旧版本(如 0.9.x),可能引发 NoSuchMethodError。
- 迁移建议:
- 新项目推荐使用 spring-security-oauth2-authorization-server + jjwt 0.12.x。
- jjwt