springboot 整合 jwt 过滤器
时间: 2025-01-04 20:28:28 浏览: 5
### 整合 JWT 过滤器到 Spring Boot 项目
为了在 Spring Boot 中实现基于 JSON Web Tokens (JWT) 的认证机制,通常会创建自定义过滤器来处理令牌验证逻辑。虽然 Spring Security 提供了一些基础类如 `AbstractPreAuthenticatedProcessingFilter` 和 `TokenService` 来帮助构建这样的解决方案[^1],但并没有提供标准的 JWT 实现。
下面是一个简单的例子展示如何设置一个 JWT 认证过滤器:
#### 添加依赖项
首先,在项目的 `pom.xml` 文件中加入必要的安全性和 JWT 处理库:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
<version>0.11.2</version>
</dependency>
```
#### 创建 JWT 验证过滤器
接着编写一个名为 `JwtRequestFilter.java` 的 Java 类作为 HTTP 请求过滤器的一部分:
```java
import org.springframework.security.core.context.SecurityContextHolder;
import io.jsonwebtoken.Claims;
public class JwtRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws ServletException, IOException {
final String authorizationHeader = request.getHeader("Authorization");
String username = null;
String jwt = null;
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
jwt = authorizationHeader.substring(7);
try {
Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(jwt).getBody();
username = claims.getSubject();
} catch (Exception e){
logger.error("Error parsing token", e);
}
}
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if (jwtUtil.validateToken(jwt, userDetails)) {
UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authToken);
}
}
chain.doFilter(request,response);
}
}
```
此代码片段展示了如何通过读取请求头中的 Bearer Token 并对其进行解码和验证来填充当前线程的安全上下文对象。
#### 注册过滤器至应用程序配置
最后一步是在应用的主要配置文件里注册这个新的过滤器组件并将其添加到 Spring Security 的过滤链中去:
```java
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final UserDetailsService userDetailsService;
private final JwtRequestFilter jwtRequestFilter;
public WebSecurityConfig(UserDetailsService userDetailsService, JwtRequestFilter jwtRequestFilter) {
this.userDetailsService = userDetailsService;
this.jwtRequestFilter = jwtRequestFilter;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().antMatchers("/authenticate").permitAll()
.anyRequest().authenticated()
.and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}
// ... other configurations ...
}
```
上述配置禁用了 CSRF 支持(对于无状态 API 是合理的),允许 `/authenticate` 路径无需身份验证即可访问,并确保所有其他路径都需要经过身份验证才能被调用。此外还设置了会话管理策略为不创建 session。
阅读全文