接口鉴权
鉴权方案对比
| 方案 | 原理 | 适用场景 | 安全性 |
|---|---|---|---|
| JWT | 自包含 Token,签名验证 | 无状态 API | 高(配合 RS256) |
| OAuth2 | 授权码 / 客户端凭证 | 第三方授权 | 高 |
| Spring Security | Filter 链 + SecurityContext | 传统 Web 应用 | 高 |
| Sa-Token | 轻量 Session + Token | 快速开发 | 高 |
JWT 鉴权
核心流程
用户登录 → 服务端签发 JWT → 返回 Access Token + Refresh Token
↓
客户端请求携带 Authorization: Bearer <token>
↓
服务端验证 → 解析 Payload → 放入 SecurityContext关键配置
yaml
jwt:
secret: your-rsa-private-key # RS256 私钥
access-token-expire: 3600 # 1 小时
refresh-token-expire: 604800 # 7 天
issuer: myappOAuth2 鉴权
授权码模式(最安全)
1. 用户访问客户端 → 重定向到授权服务器
2. 用户登录并授权 → 回调返回 code
3. 客户端用 code 换取 access_token
4. 携带 access_token 访问资源服务器Spring Security 鉴权
配置示例
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.requestMatchers("/api/user/**").authenticated()
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(Customizer.withDefaults())
);
return http.build();
}
}Sa-Token 鉴权
快速集成
xml
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.39.0</version>
</dependency>核心 API
java
// 登录
StpUtil.login(10001);
// 鉴权
StpUtil.checkLogin();
StpUtil.checkPermission("user:add");
StpUtil.checkRole("admin");
// Token 操作
String token = StpUtil.getTokenValue();
StpUtil.logout();
// 会话
StpUtil.getSession().set("key", "value");Sa-Token vs Spring Security
| 维度 | Sa-Token | Spring Security |
|---|---|---|
| 上手成本 | 低(零配置) | 高(Filter 链复杂) |
| 功能完整度 | 基础鉴权完善 | 企业级完整 |
| OAuth2 | 内置 | 需额外配置 |
| SSO | 支持 | 需扩展 |
| 社区生态 | 国内为主 | 全球主流 |