Spring 使用ControllerAdvice执行请求的REST身份验证是个好主意吗?
在我当前的SpringBoot应用程序中,我在尝试实现REST请求过滤器时似乎遇到了麻烦。我使用请求过滤器的目标是读取头部和主体部分,验证传入的数据,并检查它是否符合我们正在使用的HMAC结构 因此请求过滤器似乎不起作用。另一种解决方案是使用@ControllerAdvice 然后,可以很容易地实现请求验证。但我不确定它是否通常被视为@ControllerAdvice注释的错误用法Spring 使用ControllerAdvice执行请求的REST身份验证是个好主意吗?,spring,spring-boot,Spring,Spring Boot,在我当前的SpringBoot应用程序中,我在尝试实现REST请求过滤器时似乎遇到了麻烦。我使用请求过滤器的目标是读取头部和主体部分,验证传入的数据,并检查它是否符合我们正在使用的HMAC结构 因此请求过滤器似乎不起作用。另一种解决方案是使用@ControllerAdvice 然后,可以很容易地实现请求验证。但我不确定它是否通常被视为@ControllerAdvice注释的错误用法 @ControllerAdvice public class GenericWebControllerAdvice
@ControllerAdvice
public class GenericWebControllerAdvice {
@ModelAttribute
public void authenticationFilter(@RequestHeader(value = "Authorization") String authHeader, @RequestBody String payload) {
// process authentication based on header info and body content
// calculate the hash and check if meets the security settings
// if the hash fails throw an exception that returns a http status code
}
}
对更好的解决方案或替代方案有何评论?否您应该在控制器中进行验证(即使用
@RequestMapping的方法)
Spring支持JSR303/349bean验证。因此,如果您的请求主体是POJO,并且您具有正确的注释,Spring将自动为您进行验证。这里有这方面的教程:
至于请求参数验证(即不是bean验证),我必须创建自己的传输对象和异常处理。Spring参考指南中介绍了如何处理全局异常,但通常您会扩展和/或注册org.springframework.web.servlet.handler.SimpleMappingExceptionResolver
。具有讽刺意味的是,@ControllerAdvice
可以用于异常处理,但我发现扩展和注册异常解析器更好。更多信息可在此处找到:
根据OP评论和编辑进行编辑:
如果您正在进行身份验证或其他基于请求的验证/授权,则最好使用@ControllerAdvice
可能无法工作,因为请求处理时间太长。这就是在数据绑定发生之前您需要的东西。我注意到我没有完全表达我的问题,所以我添加了一些解释。谢谢你给我指出验证部分,但这对我没有帮助。是的,我误解了。这不是验证,而是某种身份验证检查。你试过谷歌吗@是的,我确实读过这篇文章。但不幸的是,这个实现在Servlet3.1规范下不起作用。我认为SpringSecurity
将是最好的解决方案!