深入解析Spring Boot与Spring Security整合实现JWT认证
引言
在现代Web应用中,身份认证是保障系统安全的重要环节。JWT(JSON Web Token)作为一种轻量级的认证机制,因其无状态、跨语言支持等特性,被广泛应用于分布式系统中。本文将详细介绍如何在Spring Boot项目中整合Spring Security,并实现基于JWT的身份认证机制。
技术栈
- 核心框架: Spring Boot, Spring Security
- 认证机制: JWT (JSON Web Token)
- 数据库: 可选(本文以内存数据库为例)
- 工具库: JJWT (Java JWT)
实现步骤
1. 创建Spring Boot项目
首先,使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:
- Spring Web
- Spring Security
- Lombok(可选)
2. 配置Spring Security
在Spring Boot中,Spring Security默认会启用基础认证。我们需要自定义安全配置以支持JWT认证。
java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
3. 实现JWT工具类
使用JJWT库生成和验证JWT Token。以下是一个简单的工具类示例:
java
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
}
4. 实现认证接口
创建一个REST接口,用于用户登录并返回JWT Token:
java
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody LoginRequest request) {
// 模拟用户验证
if ("admin".equals(request.getUsername()) && "password".equals(request.getPassword())) {
String token = JwtUtil.generateToken(request.getUsername());
return ResponseEntity.ok(token);
}
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
5. 配置JWT过滤器
为了在每个请求中验证JWT Token,我们需要自定义一个过滤器:
java
public class JwtFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String token = request.getHeader("Authorization");
if (token != null && JwtUtil.validateToken(token)) {
chain.doFilter(request, response);
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token");
}
}
}
6. 注册过滤器
在安全配置中注册自定义过滤器:
java
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);
}
总结
通过本文的介绍,我们了解了如何在Spring Boot项目中整合Spring Security,并实现基于JWT的身份认证机制。JWT的无状态特性使其非常适合分布式系统,而Spring Security的强大功能则为开发者提供了灵活的扩展能力。