Spring Security 返回HTTP错误401代码&跳过筛选器链

q8l4jmvw  于 2023-10-20  发布在  Spring
关注(0)|答案(5)|浏览(250)

使用自定义Spring Security过滤器,如果HTTP Header不包含特定的键值对,我想返回HTTP 401错误代码。
范例:

  1. public void doFilter(ServletRequest req, ServletResponse res,
  2. FilterChain chain) throws IOException, ServletException {
  3. HttpServletRequest request = (HttpServletRequest) req;
  4. final String val = request.getHeader(FOO_TOKEN)
  5. if(val == null || !val.equals("FOO")) {
  6. // token is not valid, return an HTTP 401 error code
  7. ...
  8. }
  9. else {
  10. // token is good, let it proceed
  11. chain.doFilter(req, res);
  12. }

据我所知,我可以做到以下几点:
(1)((HttpServletResponse) res).setStatus(401)并跳过剩余的过滤器链

(2)抛出一个异常,最终导致Spring Security向客户端抛出401错误。
如果#1是更好的选择,我如何在响应上调用setStatus(401)后跳过过滤器链?
或者,如果#2是正确的方法,我应该抛出哪个异常?

sqougxex

sqougxex1#

doFilter方法的API文档中,您可以:

*或者使用FilterChain对象(chain.doFilter())调用链中的下一个实体,
*不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理

因此,设置响应状态代码并立即返回而不调用chain.doFilter是您想要实现的最佳选择。

iqxoj9l9

iqxoj9l92#

我在下面提出这个解决方案。

  1. public void doFilter(ServletRequest req, ServletResponse res,
  2. FilterChain chain) throws IOException, ServletException {
  3. HttpServletRequest request = (HttpServletRequest) req;
  4. final String val = request.getHeader(FOO_TOKEN)
  5. if (val == null || !val.equals("FOO")) {
  6. ((HttpServletResponse) response).sendError(HttpServletResponse.SC_UNAUTHORIZED, "The token is not valid.");
  7. } else {
  8. chain.doFilter(req, res);
  9. }
  10. }
dvtswwa3

dvtswwa33#

就按上面的答案做。“所以设置响应状态码并立即返回”这只是类型:

  1. res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  2. return;
vmpqdwk3

vmpqdwk34#

你可以用这样的东西。

  1. @Override
  2. public void doFilter() {
  3. if (whiteListOrigins.contains(incomeOrigin)) {
  4. httpResponse.setHeader("Access-Control-Allow-Origin", incomeOrigin);
  5. chain.doFilter(request, response);
  6. } else {
  7. ((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Not Allowed to Access. Please try with valid Origin.");
  8. }
  9. }
cuxqih21

cuxqih215#

我也有类似的问题。由于我实现了OAuth2,我不能将所有错误作为响应返回给客户端。有些例外情况很难捕捉。

  1. res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
  2. return;

这是迄今为止唯一对我有效的解决方案。
我必须在MalformedJwtException和SignatureException上使用它,因为如果我使用response.sendError(),它就不起作用,第二次调用它会抛出另一个错误。

相关问题