2017-06-22 45 views
0

Spring Boot here。我刚刚在Spring Security上读到这个excellent Baeldung article,并用它来实现基本的身份验证。我有兴趣实现一个简单的REST服务(所以没有 UI/webapp),我需要建立。配置Spring WebSecurityConfigurerAdapter以使用异常处理程序

我特别感兴趣的是BasicAuthenticationEntryPoint impl。在这种IMPL的commence覆盖,作者:

  1. 添加一个WWW-Authenticate头的响应;和
  2. 在响应上设置HTTP状态码;和
  3. 将实际响应实体直接写入响应;和
  4. 设置

我想按照这个作者的例子来实现基本的身份验证我的应用程序领域的名字,但我已经有一个完美的运作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与异常处理程序绑定,以便失败的身份验证或授权尝试会抛出异常,然后由我的异常处理程序捕获异常。

我的动机这样做会这样,我的异常处理程序是,当任何异常发生时,它是否AUTH相关或者不进行管理和配置HTTP响应的中央位置。

这是可能的,如果是这样,怎么办?如果可能的话,我是否还需要将WWW-Authenticate添加到我的异常处理程序中的响应中(为什么/为什么不)?提前致谢!

+0

你错了。春季和春季安全(是ACEGI)是不同的历史不同的项目。参见[Wikipedia](https://en.wikipedia.org/wiki/Spring_Security)。因此整合并不完美。 – dur

+0

我同意你作为Spring用户的观点,但看到历史并不奇怪(这是我的观点)。 Spring Security的许多核心部分仍然来自ACEGI。如果你有问题,你可以尝试改变Spring Security(成为一个提交者或者至少创建一个功能请求),与之共存或根本不使用Spring。 – dur

回答

0

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

有过类似的问题,我结束了使用自定义org.springframework.security.web.AuthenticationEntryPoint它发送一个错误,这反过来又被转发到自定义org.springframework.boot.autoconfigure.web.ErrorController

相关问题