【问题标题】:Validation of JWT token along with requestBody parameter in springBoot在 springBoot 中验证 JWT 令牌以及 requestBody 参数
【发布时间】:2021-08-04 23:47:56
【问题描述】:

我有一个响应式 Spring Boot 应用程序,其中我有不同的控制器,并且所有控制器都有 get、post、put、delete 方法 GET 和 DELETE 方法 URI 格式 => /{userName}/{others} 并确保 put 和 post 方法在其请求正文中必须具有字段 userid。 还有所有具有授权标头的请求。

而且我已经有一个名为 validate 的方法,它接受 2 个参数 authorizationHeader 和 userName,如果此映射存在则返回 true,否则返回 false。

我正在尝试编写通用过滤器,可以过滤传入的请求并在进入控制器之前进行验证。

如何编写这个通用的网络过滤器,尤其是如何从发布请求中提取正文并验证请求。

我试着写这个

@Component
@Slf4j
public class ExampleWebFilter implements WebFilter {
@Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {

        ObjectMapper mapper = new ObjectMapper();

        return serverWebExchange
                .getRequest()
                .getBody()
                .next()
                .flatMap(body -> {
                    try {
                        return validate(body, serverWebExchange
                .geHeaders().get(0))
                    } catch (IOException e) {
                        return Mono.error(e);
                    }
                })
                .flatMap((boolean s) -> {
                    return webFilterChain.filter(serverWebExchange);
                });
    }
    
    Mono<Boolean> validate(DataBuffer body, String Header){
    
    //my logic to validate 
    
    }
    
    }

但似乎在执行此过滤器方法后它挂起。所以我的问题是

  1. 如何编写能够读取正文并进行验证的 webfilter?
  2. 在 spring-boot 中是否有针对此类问题的其他通用解决方案?

【问题讨论】:

  • 为了在 Spring Boot 中实现 JWT 身份验证,我通常使用 Spring Security:javainuse.com/spring/boot-jwt
  • 授权头会有什么样的值,是JWT吗?
  • 是的,它是 JWT @MidhunMohan
  • 那么只是一个建议,而不是使用 req 正文中的 userId,我们是否应该在 jwt 上有一个 uid->userid 声明并在它有效时使用它。在这种情况下,您只需要访问标题并执行必要的操作。但如果 API 中预期的用户 id 不是令牌所有者的 id,这将不起作用

标签: java spring spring-boot spring-mvc spring-security


【解决方案1】:

我认为你应该使用拦截器。您可以拦截 http 调用,并对请求进行验证。您可以全局执行此操作,也可以针对特定端点/路径执行此操作。这是您的案例的示例。

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler) throws 
      Exception {
  
      return true;
   }
   @Override
   public void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception {
      //make validations 
    }

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
     Object handler, Exception exception) throws Exception {
      //make validations
   }
}

在此之后,您需要注册您的拦截器,如下所示。

@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

有关更多深度信息,您可以访问以下链接。

【讨论】:

  • 实际上我正在使用 spring-boot-webflux 我的应用程序是反应式的,所以没有 HandlerInterceptor 适合我。它对我不起作用。有 AsyncWebRequestInterceptor 但 requestBody 在那里无法访问。
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 2017-07-27
  • 2019-10-20
  • 2016-01-17
  • 1970-01-01
  • 2018-08-30
  • 2018-03-07
  • 2018-10-16
相关资源
最近更新 更多