如果尝试身份验证不成功,如何在过滤器中返回 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
成功 IMC 身份验证后 Worklight 身份验证错误 401
在 Django (DRF) 中使用外部 API 进行基于令牌的身份验证