配置Spring WebSecurityConfigurerAdapter以使用异常处理程序

时间:2017-06-22 14:05:03

标签: spring spring-security exception-handling

Spring Boot here。我刚刚在Spring Security上阅读了这个excellent Baeldung article并用它实现了基本的auth。我有兴趣为一个简单的REST服务(所以没有 UI / webapp)实现它,我需要构建它。

我对BasicAuthenticationEntryPoint impl特别感兴趣。在这个impl的commence覆盖中,作者:

  1. 在响应中添加WWW-Authenticate标头;和
  2. 在响应中设置HTTP状态代码;和
  3. 将实际响应实体直接写入响应;和
  4. 设置领域的名称
  5. 我想按照这位作者的示例为我的应用实现基本身份验证,但我已经有一个功能完善的ResponseEntityExceptionHandler适用于我的应用:

    @ControllerAdvice
    public class MyAppExceptionMapper extends ResponseEntityExceptionHandler {
        @ExceptionHandler(IllegalArgumentException.class)
        @ResponseBody
        public ResponseEntity<ErrorResponse> handleIllegalArgumentExeption(IllegalArgumentException iaEx) {
            return new ResponseEntity<ErrorResponse>(buildErrorResponse(iaEx,
                    iaEx.message,
                    "Please check your request and make sure it contains a valid entity/body."),
                HttpStatus.BAD_REQUEST);
        }
    
        // other exceptions handled down here, etc.
    
        // TODO: Handle Spring Security-related auth exceptions as well!
    }
    

    有没有办法将Spring Security和Basic Auth失败绑定到现有/工作ResponseEntityExceptionHandler

    理想情况下,有一种方法可以将我的WebSecurityConfigurerAdapter impl绑定到异常处理程序中,以便失败的身份验证或授权尝试抛出异常,然后由异常处理程序捕获。

    我这样做的动机是,当任何异常发生时,我的异常处理程序是管理和配置HTTP响应的中心位置,无论它是否与auth相关。

    这可能吗,如果可以,怎么做?如果有可能,我还需要在我的异常处理程序中将WWW-Authenticate添加到响应中(为什么不这样做)?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为这是可能的。在请求到达任何@Controller带注释的类之前,Spring安全性作为ServletFilter应用 - 因此Spring Security抛出的异常不能被异常处理程序捕获(用@ControllerAdvice注释)。

遇到类似问题后,我最终使用了自定义org.springframework.security.web.AuthenticationEntryPoint,该错误会发送错误,而错误会转发给自定义org.springframework.boot.autoconfigure.web.ErrorController