gpt4 book ai didi

java - 当 Spring SecurityContextHolder 在 getPrincipal 上返回 null 时,应该抛出哪个异常?

转载 作者:行者123 更新时间:2023-12-02 09:23:33 25 4
gpt4 key购买 nike

哪种异常最适合描述 RESTful 设计中缺少 Spring Security 主体的情况,例如,当我从 SecurityContextHolder.getContext().getAuthentication( 获取主体时得到 null 时).getPrincipal()

我有一个带有自定义授权服务的项目,其中一部分需要有关已登录的委托(delegate)人和他拥有哪些权限的信息。

一些(但不是全部)REST 端点也受到 Spring Security 的保护。

无论系统变得越来越大,可能会出现错误,未经授权的用户都会通过 Controller 层,并尝试通过自定义授权服务来访问 protected 数据。

一方面,最适合的异常似乎是 AccessDeniedException (Http 403),但另一方面,抛出 500 或 404 来“隐藏”可能是更安全的方法所请求的资源是否存在。

我考虑了以下异常(exception)情况:

  • HttpStatus:500 由 org.springframework.security.access.AuthorizationServiceException 引起
  • HttpStatus:403 org.springframework.security.access.AccessDeniedException
  • HttpStatus:500 由 java.lang.IllegalStateException 引起
  • HttpStatus:500 由 java.lang.NullPointerException 引起

我不相信哪种方法更好 - 禁止、隐藏或引发内部服务器错误。

最佳答案

如果您使用 Spring Security 和自定义授权服务,您可能会遇到如下情况:

@Component
public class CustomAccessDeniedHandler extends AccessDeniedHandlerImpl {
private final String HOME_PAGE = "/index.html";

@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (auth != null) {

if (auth instanceof AnonymousAuthenticationToken) {
response.sendRedirect("/#/login");
super.handle(request, response, e);
return;
}

if (auth.getAuthorities().iterator().next().getAuthority().equals("ROLE_EMPLOYEE") || auth.getAuthorities().iterator().next().getAuthority().equals("ROLE_ADMIN") ) {
response.sendRedirect("/dashboard/Dashboard.xhtml");
super.handle(request, response, e);
return;
}
response.sendRedirect("/#/dashboard/user");
}
super.handle(request, response, e);
}
}

就您而言,在应用程序中,我宁愿建议重定向到登录屏幕(如上所示),并显示类似请登录的消息。

在 API 中,我将返回 404 - 未找到资源 响应。

关于java - 当 Spring SecurityContextHolder 在 getPrincipal 上返回 null 时,应该抛出哪个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com