Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 使用ControllerAdvice执行请求的REST身份验证是个好主意吗?_Spring_Spring Boot - Fatal编程技术网

Spring 使用ControllerAdvice执行请求的REST身份验证是个好主意吗?

Spring 使用ControllerAdvice执行请求的REST身份验证是个好主意吗?,spring,spring-boot,Spring,Spring Boot,在我当前的SpringBoot应用程序中,我在尝试实现REST请求过滤器时似乎遇到了麻烦。我使用请求过滤器的目标是读取头部和主体部分,验证传入的数据,并检查它是否符合我们正在使用的HMAC结构 因此请求过滤器似乎不起作用。另一种解决方案是使用@ControllerAdvice 然后,可以很容易地实现请求验证。但我不确定它是否通常被视为@ControllerAdvice注释的错误用法 @ControllerAdvice public class GenericWebControllerAdvice

在我当前的SpringBoot应用程序中,我在尝试实现REST请求过滤器时似乎遇到了麻烦。我使用请求过滤器的目标是读取头部和主体部分,验证传入的数据,并检查它是否符合我们正在使用的HMAC结构

因此请求过滤器似乎不起作用。另一种解决方案是使用@ControllerAdvice

然后,可以很容易地实现请求验证。但我不确定它是否通常被视为@ControllerAdvice注释的错误用法

@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
将是最好的解决方案!