如果尝试身份验证不成功,如何在过滤器中返回 401 状态

Posted

技术标签:

【中文标题】如果尝试身份验证不成功,如何在过滤器中返回 401 状态【英文标题】:How to return 401 status in Filter if attemptAuthentication is not successful 【发布时间】:2018-06-13 08:58:07 【问题描述】:

我正在尝试覆盖 class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter 中的 attemptAuthentication 方法 但如果登录名和密码不正确,它会返回 500 状态。如何返回 401?

 @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException 
        try 
            ApplicationUser creds = new ObjectMapper()
                    .readValue(req.getInputStream(), ApplicationUser.class);

            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            creds.getUsername(),
                            creds.getPassword(),
                            new ArrayList<>())
            );
         catch (Exception e) 
            throw new RuntimeException(e);
        
    

【问题讨论】:

【参考方案1】:

更改异常类

catch (IOException e) 

让它返回 401。但是为什么呢??

【讨论】:

【参考方案2】:

是 AuthenticationException 导致它返回 401。如果你捕获 Exception,它也会捕获 AuthenticationException。

【讨论】:

删除是不可能的,因为超类不支持我的特定 IOException。我自己的 AuthenticationException 捕获子句可以工作,但是如果我可以在 IOException 上更改 Exception,为什么要这样做。因此,当发生 AuthenticationException 时,它会进一步上升。现在我不明白为什么了。 啊,我没有意识到你需要捕获 IOException。是的,那么这是正确的方法。我将从我的答案中删除该部分。

以上是关于如果尝试身份验证不成功,如何在过滤器中返回 401 状态的主要内容,如果未能解决你的问题,请参考以下文章

在 Ocelot 中注入 AuthenticationMiddleware - 如何返回 401

NestJs JWT 身份验证返回 401

成功 IMC 身份验证后 Worklight 身份验证错误 401

在 Django (DRF) 中使用外部 API 进行基于令牌的身份验证

Spring Security - 获取登录页面时,安全性尝试进行身份验证并返回 401 错误

使用电子邮件进行身份验证时,NestJS 护照身份验证返回 401