springboot 鉴权拦截token
时间: 2025-01-05 19:29:54 浏览: 8
### 创建鉴权拦截器处理 Token 验证
为了在 Spring Boot 项目中实现鉴权拦截器来验证 Token,可以遵循以下方法:
#### 定义拦截器类
定义一个实现了 `HandlerInterceptor` 接口的拦截器类用于执行特定逻辑。此拦截器负责刷新 token 和验证用户身份。
```java
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class AuthTokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
try {
// 解析并验证token有效性
String token = authHeader.substring(7);
// 这里应该调用服务层的方法解析和校验token
return true; // 继续请求流程
} catch (Exception e) {
// 如果发生异常,则返回false阻止后续操作
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid or expired token.");
return false;
}
}
// 若无有效认证信息则直接拒绝访问
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Missing authorization header.");
return false;
}
}
```
上述代码展示了如何通过读取 HTTP 请求头中的 Authorization 字段获取 Bearer 类型的 JWT-token 并对其进行初步检查[^1]。
#### 注册自定义拦截器到全局配置
为了让应用程序能够识别新创建的拦截器,在 WebMvcConfigurer 的子类中注册它作为全局过滤器的一部分。
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final AuthTokenInterceptor authTokenInterceptor;
@Autowired
public WebConfig(AuthTokenInterceptor authTokenInterceptor) {
this.authTokenInterceptor = authTokenInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authTokenInterceptor).addPathPatterns("/api/**"); // 只对API路径下的资源启用拦截功能
}
}
```
这段代码说明了怎样将之前编写的拦截器加入到应用上下文中,并指定了其作用范围仅限于 `/api/` 开始的 URL 路径下[^2]。
#### 用户角色权限控制
对于更复杂的场景比如基于角色的访问控制(RBAC),可以在原有基础上进一步扩展。当成功解码出用户的 role 后将其附加至当前线程局部变量以便下游业务逻辑使用;同时也可以在此阶段决定是否允许继续执行目标控制器动作。
```java
// 在AuthTokenInterceptor.preHandle() 方法内追加如下逻辑:
Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
String userRole = claims.getSubject(); // 或者其他方式提取role字段
if ("admin".equals(userRole)) {
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userRole, null));
} else {
throw new AccessDeniedException("Insufficient privileges to access resource.");
}
```
这里假设已经集成了 JWT 库并且拥有合适的密钥来进行签名验证。此外还涉及到 Spring Security 提供的安全框架组件以简化安全策略实施过程[^3]。
阅读全文