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.
}
我一直在使用 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.
}