spring-security 将Spring Security更改为在身份验证失败时返回401

vbopmzt1  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(185)

在我的Sping Boot (v. 2.7.0)应用程序中,我使用Spring Security进行身份验证。如果用户试图使用无效的凭据登录,服务器将以403(禁止)状态代码响应,但我希望使用401(未授权)。
我在配置中找不到任何指示SpringSecurity的默认行为已被覆盖的内容,但无论是否已被覆盖,我都希望在身份验证失败时返回401。
我逐步执行了相关的SpringSecurity代码,当身份验证失败时,似乎会调用SpringSecurity方法SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure

  1. response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());

但是由于某种原因,403被返回到客户端-所以我猜响应在上面的行之后被改变了。

**如何更改Spring Security以在身份验证失败时返回401?**我在下面提供了我的安全配置以供参考。

  1. @EnableWebSecurity
  2. @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
  3. public class SecurityConfiguration {
  4. @Autowired
  5. private AuthenticationConfiguration authenticationConfiguration;
  6. @Bean
  7. public SecurityFilterChain configure(HttpSecurity http) throws Exception {
  8. AuthenticationManager authenticationManager = authenticationConfiguration.getAuthenticationManager();
  9. var jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager);
  10. var jwtAuthorisationFilter = new JwtAuthorisationFilter();
  11. http.cors().and().csrf().disable().authorizeRequests()
  12. .anyRequest().authenticated().and()
  13. .addFilter(jwtAuthenticationFilter)
  14. .addFilterAfter(jwtAuthorisationFilter, BasicAuthenticationFilter.class)
  15. .sessionManagement()
  16. .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
  17. return http.build();
  18. }
  19. }

JwtAuthenticationFilter会呼叫authenticationManager.authenticate,如果认证无效,则会掷回org.springframework.security.authentication.BadCredentialsException

更新

我尝试添加一个自定义的AuthenticationFailureHandler bean,如this article中所述,但是我的自定义bean从未被调用(而是调用了默认bean SimpleUrlAuthenticationFailureHandler)。

anhgbhbe

anhgbhbe1#

您可以提供自己的自定义AccessDeniedHandler实现。

  1. @Bean
  2. public SecurityFilterChain configure(HttpSecurity http) throws Exception {
  3. AuthenticationManager authenticationManager = authenticationConfiguration.getAuthenticationManager();
  4. var jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager);
  5. var jwtAuthorisationFilter = new JwtAuthorisationFilter();
  6. http.cors().and().csrf().disable().authorizeRequests()
  7. .anyRequest().authenticated().and()
  8. .addFilter(jwtAuthenticationFilter)
  9. .addFilterAfter(jwtAuthorisationFilter, BasicAuthenticationFilter.class)
  10. .sessionManagement()
  11. .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  12. .and()
  13. .exceptionHandling()
  14. .accessDeniedHandler( (request, response, exception) ->
  15. response.sendError(HttpStatus.UNAUTHORIZED.value(), exception.getMessage()
  16. ));
  17. return http.build();
  18. }
展开查看全部

相关问题