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

时间:2015-03-24 15:26:59

标签: spring spring-boot

在我目前的Spring Boot应用程序中,当试图实现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
    }
}

对解决方案或替代方案的评论是否更好?

1 个答案:

答案 0 :(得分:2)

不,您应该在控制器中进行验证(即使用@RequestMapping的方法)。

Spring支持JSR 303/349 bean验证。因此,如果您的请求正文是POJO并且您有正确的注释,Spring将自动为您进行验证。这里有一个教程:

http://www.leveluplunch.com/java/tutorials/017-validate-spring-rest-webservice-request/

对于请求参数验证(即不是bean验证),我必须自己制作传输对象和异常处理。 Spring参考指南中介绍了如何进行全局异常处理,但通常会扩展和/或注册org.springframework.web.servlet.handler.SimpleMappingExceptionResolver。具有讽刺意味的是,@ControllerAdvice可用于异常处理,但我发现扩展和注册异常解析器更好。更多信息可以在这里找到:

根据OP评论和修改进行编辑:

如果您进行身份验证或其他基于请求的验证/授权,最好使用InterceptorReference doc@ControllerAdvice可能不会起作用,因为请求处理太长了。那就是在数据绑定发生之前你想要的东西。