Spring SecurityContext возвращает нулевую аутентификацию на страницах ошибок - PullRequest
7 голосов
/ 10 июня 2011

Я пытаюсь написать пользовательскую страницу ошибок для ошибок, таких как 403 (доступ запрещен) и 500 (внутренняя ошибка сервера).Они будут отображаться из шаблона Velocity, и все сообщения будут переведены с использованием языка пользователя.Аутентификация и разрешение локали прекрасно работает в приложении.

Я установил местоположение в web.xml как желаемую страницу, а в webmvc-context.xml я добавил контроллер для просмотра запросов через.

Проблема, с которой я столкнулся, заключается в том, что SecurityContextHolder.getContext (). GetAuthentication () возвращает нулевое значение в представлении страницы ошибки.Глядя на журнал, я увидел:

06.10 14:42:26 DEBUG - context.HttpSessionSecurityContextRepository(HttpSessionSecurityContextRepository.java:351) -  - SecurityContext stored to HttpSession: 'org.springframework.security.core.context.SecurityContextImpl@ece7b0b7: Authentication: ...
06.10 14:42:26 DEBUG - context.SecurityContextPersistenceFilter(SecurityContextPersistenceFilter.java:89) -  - SecurityContextHolder now cleared, as request processing completed
06.10 14:42:26 DEBUG - servlet.DispatcherServlet(DispatcherServlet.java:691) -  - DispatcherServlet with name 'foo' processing GET request for [/foo/app/error/403.html]

Так что Spring или Tomcat перенаправляют на страницу с ошибкой и жест запроса завершается, поэтому контекст очищается.И новый «запрос» не подвергается фильтрам Spring Security, поэтому не восстанавливает контекст.

Обычный способ не работает, но кажется, что информация аутентификации находится где-то в сеансе, в том числе из-за AbstractTemplateViewрегистрирует следующее:

Exposing session attribute 'SPRING_SECURITY_CONTEXT' with value [org.springframework.security.core.context.SecurityContextImpl@edfbd958: Authentication: org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@edfbd958...

Как правильно получить, чтобы и обычные страницы, и страницы ошибок работали одинаково?

Ответы [ 2 ]

6 голосов
/ 16 декабря 2013

Проблема может заключаться в том, что springSecurityFilterChain не перехватывает ОШИБКИ.Попробуйте изменить отображение в файле web.xml на

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
6 голосов
/ 10 июня 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что ExceptionTranslationFilter, который переводит исключения в страницы ошибок, предшествует SecurityContextPersistenceFilter, который извлекает аутентификацию из SecurityContextRepository и помещает ее в SecurityContextHolder. Когда запрос заканчивается, SecurityContextPersistenceFilter забирает информацию из SecurityContextHolder.

Причина, по которой он очищает SecurityContextHolder, заключается в том, что SecurityContextHolder обычно является локальным потоком, и если контейнер сервлета будет повторно использовать поток (большинство так делают), они могут случайно передать эти учетные данные кому-то другому.

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

Лучше всего написать пользовательский ExceptionTranslationFilter, который принимает SecurityContextRepository (часто, как вы упомянули, HTTP-сеанс) и предоставляет доступ к Authentication через SecurityContextRepository, а не SecurityContextHolder , Имейте в виду, что Authentication все равно будет нулевым, если пользователь не вошел в систему.

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