Spring 安全基本身份验证总是导致 404

Spring Security Basic Authentication always causes 404

我一直在使用 Spring 构建 REST API。我正在使用具有 Spring 安全性 (3.2) 的基本身份验证,我遇到一个问题,即任何未经身份验证的请求都会导致 404 错误,即使实现了 AuthenticationEntryPoint(无论如何,Spring 应该给出 401据我所知默认)。在我的浏览器中请求资源,我什至没有提示输入凭据。这是问题的屏幕截图:

在阅读了有关该主题的文档和大量教程之后,我似乎找不到哪里出了问题。我唯一能想象的是正在发生的一些异常被捕获。

Spring 安全配置:

@Slf4j
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    private static final String REALM_NAME = "Autopulse API";

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private AuthenticationEntryPoint authenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // Set to stateless authentication.
        httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        httpSecurity.csrf().disable();
        httpSecurity.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
        httpSecurity.userDetailsService(userDetailsService);

        httpSecurity.authorizeRequests()
          .antMatchers("/make/private").authenticated();

        httpSecurity.httpBasic().realmName(REALM_NAME);
    }
}

身份验证入口点:

@Slf4j
@Component
public class HttpBasicAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }
}

控制器:

@Slf4j
@RestController
@RequestMapping("/make")
public class MakeController {
    @RequestMapping(value = "/private", method = RequestMethod.GET)
    public String getPrivateStuff() {
        return "private things!";
    }
}

当我在授权 header 中提供 有效 用户凭据时,我可以看到受保护的资源 ("private things!"),但是如果我不提供授权 header,或者我输入了无效的凭据,我只会收到 404 错误。如果需要,我可以附上我的用户详细信息服务和用户详细信息 类。

我明白了。问题归结为 Spring 和异常处理。我有一个名为 ExceptionController 的 class,它看起来像:

@Slf4j
@RestController
@ControllerAdvice
public class ExceptionController implements ErrorController {

  // @ExceptionHandler methods here.

  @Override
  public String getErrorPath() {
    return null;
  }
}

事实证明,通过实施 ErrorController,我在身份验证入口点 Spring 找不到合适的方法并最终抛出不需要的 404 错误之后将控制权交给这个 class .解决方法是删除这些细节:

@Slf4j
@RestController
@ControllerAdvice
public class ExceptionController {

  // @ExceptionHandler methods here.

}