Какое исключение следует выдать, когда Spring SecurityContextHolder возвращает значение null в getPrincipal? - PullRequest
0 голосов
/ 22 октября 2019

Какое исключение лучше всего подходит для описания отсутствия принципала безопасности Spring в дизайне RESTful, например, когда я получаю null при получении принципала от SecurityContextHolder.getContext().getAuthentication().getPrincipal()?

У меня есть проект с пользовательскимслужба авторизации, и одна ее часть нуждается в информации о Принципале, который вошел в систему и какие полномочия он имеет.

Некоторые (но не все) конечные точки REST также защищены Spring Security.

Однако система становится все больше и больше, и может произойти ошибка, когда неавторизованный пользователь пройдет через уровень контроллера,и попытается получить доступ к защищенным данным с помощью пользовательской службы авторизации.

С одной стороны, лучше всего подходит исключение AccessDeniedException (Http 403), но с другой стороны это может бытьболее безопасный подход - бросить 500 или 404, чтобы «скрыть» существование запрошенного ресурса.

Я подумал о следующих исключениях:

  • HttpStatus: 500 вызвано org.springframework.security.access.AuthorizationServiceException
  • HttpStatus: 403 org.springframework.security.access.AccessDeniedException
  • HttpStatus: 500 caused by java.lang.IllegalStateException
  • HttpStatus: 500 caused by java.lang.NullPointerException

Я не уверен, какойлучше подход - запретить, спрятать или кинуть внутреннюю ошибку сервера.

1 Ответ

1 голос
/ 22 октября 2019

Если вы используете 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);
    }
}  

В вашем случае в приложении я бы предпочел перенаправить на экран входа в систему -как показано выше, с сообщением типа Please log in.

В API я бы вернул 404 - Resource not found ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...