当前位置: 首页 > 知识库问答 >
问题:

当Spring security基本身份验证中的身份验证失败时,我如何返回ResponseEntity(HttpStatus.UNAUTHORIZED)?

范楚
2023-03-14

我在我的微服务中使用Spring Security基本身份验证来验证客户端,我向消费者提供了我将返回响应作为响应实体

我扩展了BasicAuthenticationEntryPoint,将自己的身份验证入口点自定义为MyBasicAuthenticationEntryPoint。然后抛出一个异常并尝试从@ExceptionHandler处理。但是,这不起作用。此外,我用@ControllerAdvice注释了这个类,并了解到这将处理仅从控制器引发的异常。另外,@ExceptionHandler将在DispatcherServlet之后处理异常,而在我的情况下,请求没有到达控制器,因为请求头中缺少授权细节。

我在这里所能做的就是在HttpServletResponse中包含我的响应头和响应状态。我想知道,当客户试图将返回类型作为ResponseEntity时,是否会处理这个问题

在WebSecurity配置适配器扩展类的config方法中定义了自定义身份验证入口点。

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().
                authorizeRequests()
                .antMatchers(HttpMethod.POST)
                .authenticated()
                .antMatchers("/api-docs",  "/swagger*/**")
                .permitAll()
                .and()

.httpBasic().authenticationEntryPoint(authenticationEntryPoint)
                ;


        http.headers().frameOptions().disable();
    }
}

创建我的自定义身份验证切入点如下,

@Component
public class MyBasicAuthenticationEntryPoint extends 
BasicAuthenticationEntryPoint {

    @Override
    public void commence
      (HttpServletRequest request, HttpServletResponse response, 
AuthenticationException authEx) 
      throws IOException, ServletException {
        System.out.println("Child Class");
        throw new UnauthorizedException("unauthorized");
        //response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}

通过扩展RuntimeException类定义UnauthorizedException类。

public class UnauthorizedException  extends RuntimeException {
 public UnauthorizedException(String message) {
 super(message);
 }
}

在ResponseEntityExceptionHandler扩展类中处理了上述异常,如下所示,

@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends 
ResponseEntityExceptionHandler {
  @ExceptionHandler(UnauthorizedException.class)
  public final ResponseEntity<Void> 
handleNotFoundException(UnauthorizedException ex, WebRequest request) {
      System.out.println("handling 401");
      return new ResponseEntity<>((HttpStatus.UNAUTHORIZED));
 }
}

我希望返回响应实体

共有1个答案

督坚白
2023-03-14

CustomizedResponseEntityExceptionHandler仅处理控制器内遇到的异常,这是自解释的。

您错误配置了authEntryPoint,请参阅此答案以了解如何正确配置它。

为了实现您想要的,您可以直接写入MyBasicAuthenticationEntryPoint中的响应。开始

 类似资料:
  • http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.3.xsd“>

  • Tweepy API请求twitter return me Twitter错误响应:状态代码=401。 这是我的实际代码: 我曾试图用tweepy软件包删除推文,并获得了所有必需的密钥。镊子包装不起作用吗?有人能帮我解决这个问题吗。

  • 问题内容: 从HttpClient 4.3开始,我一直在使用HttpClientBuilder。我正在连接到具有基本身份验证的REST服务。我将凭据设置如下: 但是,这不起作用(我正在使用的REST服务返回401)。怎么了? 问题答案: 从此处的 抢先身份验证 文档中: http://hc.apache.org/httpcomponents-client- ga/tutorial/html/aut

  • 问题内容: 尝试使用JavaMail中的NTLM连接到Exchange服务器。我可以连接到SMTP,但不能连接到IMAP。我还可以使用相同的主机/用户名/密码通过OS X Mail.app应用程序进行身份验证,帐户类型=“ IMAP”,端口143,ssl = false,authentication = NTLM,域名=“。 连接代码: 输出: 我尝试通过http://www.oracle.com

  • 我相对来说是JMeter的新手,但是我很难让HTTP Sampler登陆到一个安全的网页上。我认为它需要NTLM认证,所以我使用HTTP授权管理器来传递BlazeMeter指南中指定的凭证 我的授权管理器具有以下值: 基本网址: https:// [测试站点] 用户名: [我的用户名] 密码: [我的密码] 域:与基本网址相同 机制: BASIC_DIGEST 然而,我只是得到一个401错误(见下

  • 问题内容: 以下是我从GoLang获得的MongoDB连接拨号。但是它返回一个紧急消息“ SASL身份验证步骤服务器返回错误:身份验证失败。 ”。我的用户名,密码,hostAddrs和dbName是正确的。我在这里想念什么? 问题答案: 我遇到类似的错误并添加了参数,并且在我们连接到远程MongoDB时可以正常工作 在您的代码中使用以下类似格式: