如何在 Spring 框架中检查某些端点的 HTTP 请求 header
How to check HTTP request header for certain endpoints in Spring Framework
我有一个用于 IFTTT 平台的简单 Spring 引导 REST 服务。每个授权请求都将包含一个 header IFTTT-Service-Key
和我帐户的服务密钥,我将使用它来处理请求或 return 401(未授权)。但是,我只想对 select 个端点执行此操作——特别是不对任何 Spring 个执行器端点执行此操作。
我研究了 Spring 安全性,使用过滤器,使用 HandlerInterceptors
,但 none 似乎完全符合我的要求。 Spring 安全性似乎带有很多额外的东西(尤其是默认用户登录),过滤器似乎与用例不匹配,处理程序拦截器工作正常但我必须将逻辑编码到观看特定的网址并忽略其他网址。
实现我想要做的事情的最佳方法是什么?
供参考,这是我现在的代码:
public class ServiceKeyValidator implements HandlerInterceptor {
private final String myIftttServiceKey;
public ServiceKeyValidator(@Value("${ifttt.service-key}") String myIftttServiceKey) {
this.myIftttServiceKey = myIftttServiceKey;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO will have to put logic in to skip this when actuator endpoints are added
String serviceKeyHeader = request.getHeader("IFTTT-Service-Key");
if (!myIftttServiceKey.equals(serviceKeyHeader)) {
var error = new Error("Incorrect value for IFTTT-Service-Key");
var errorResponse = new ErrorResponse(Collections.singletonList(error));
throw new UnauthorizedException(errorResponse);
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
您需要在注册 HandlerInterceptor
的地方为所需的端点添加过滤。
例如:
@EnableWebMvc
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(
new ServiceKeyValidator())
.addPathPatterns("/ifttt/**")
.excludePathPatterns("/actuator/**");
}
}
您可以使用不同的 URLs 路径匹配器来过滤哪些 URL 端点必须由您的拦截器处理,哪些不是。作为配置this的方法addPathPatterns returns InterceptorRegistration对象
我有一个用于 IFTTT 平台的简单 Spring 引导 REST 服务。每个授权请求都将包含一个 header IFTTT-Service-Key
和我帐户的服务密钥,我将使用它来处理请求或 return 401(未授权)。但是,我只想对 select 个端点执行此操作——特别是不对任何 Spring 个执行器端点执行此操作。
我研究了 Spring 安全性,使用过滤器,使用 HandlerInterceptors
,但 none 似乎完全符合我的要求。 Spring 安全性似乎带有很多额外的东西(尤其是默认用户登录),过滤器似乎与用例不匹配,处理程序拦截器工作正常但我必须将逻辑编码到观看特定的网址并忽略其他网址。
实现我想要做的事情的最佳方法是什么?
供参考,这是我现在的代码:
public class ServiceKeyValidator implements HandlerInterceptor {
private final String myIftttServiceKey;
public ServiceKeyValidator(@Value("${ifttt.service-key}") String myIftttServiceKey) {
this.myIftttServiceKey = myIftttServiceKey;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO will have to put logic in to skip this when actuator endpoints are added
String serviceKeyHeader = request.getHeader("IFTTT-Service-Key");
if (!myIftttServiceKey.equals(serviceKeyHeader)) {
var error = new Error("Incorrect value for IFTTT-Service-Key");
var errorResponse = new ErrorResponse(Collections.singletonList(error));
throw new UnauthorizedException(errorResponse);
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
您需要在注册 HandlerInterceptor
的地方为所需的端点添加过滤。
例如:
@EnableWebMvc
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(
new ServiceKeyValidator())
.addPathPatterns("/ifttt/**")
.excludePathPatterns("/actuator/**");
}
}
您可以使用不同的 URLs 路径匹配器来过滤哪些 URL 端点必须由您的拦截器处理,哪些不是。作为配置this的方法addPathPatterns returns InterceptorRegistration对象