Вам нужно отладить ваши настройки. Сценарий довольно прост: если пользователь успешно прошел аутентификацию, он имеет SecurityContext, доступный в текущем потоке (доступный через SecurityContextHolder). Если после исключения нет доступного SecurityContext для текущего потока, что-то должно быть удалено, заменено или очищено. Это легко выяснить с помощью отладки доступа к HttpSession и SecurityContextHolder. Дополнительная область, которую стоит проверить, - это какой экземпляр SecurityContextHolderStrategy используется - глобальный, TLS или наследуемый TLS.

тображении исключения на страницу 404 теги Spring Security не могут найти информацию аутентификации из контекста безопасности. С «настоящим» 404 аутентификация найдена.

Мой web.xml:

<error-page>
  <exception-type>com.example.NotFoundException</exception-type>
  <location>/app/404</location>
</error-page>

<error-page>
  <error-code>404</error-code>
  <location>/app/404</location>
</error-page>

На JSP у меня есть:

<sec:authorize access="hasRole('ROLE_USER')">
  <%-- Show navigation links --%>
</sec:authorize>
<sec:authorize access="isAnonymous()">
  <%-- Show login form --%>
</sec:authorize>

/app/404 путь сопоставлен с контроллером, который просто возвращает представление. Когда я просматриваю/foo/some_invalid_id NotFoundException выдается из контроллера и, наконец, когда он идет в JSP, он не может найти аутентификацию вSecurityContext и не предоставляет ни один из двух вариантов. Вместо этого, когда я просматриваю/something_that_really_doesnt_exist он может выяснить, вошел я в систему или нет, и отображает правильный HTML.

Ответы на вопрос(2)

Ваш ответ на вопрос