Отображение исключения на страницу 404 при использовании ярлыков Spring Security - PullRequest
9 голосов
/ 24 января 2011

При отображении исключения на страницу 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 ]

17 голосов
/ 01 июня 2011

Добавьте следующие два элемента диспетчера в ваше сопоставление фильтра безопасности Spring:

<filter-mapping>
    ...
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

По умолчанию только обычные запросы проходят через определенное сопоставление фильтра.

"INCLUDE" и "FORWARD "- это два других допустимых значения элемента диспетчера.

0 голосов
/ 24 января 2011

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

Но на самом деле нет необходимости проверять isAnonymous() - достаточно проверить, нет ли у пользователя полномочий ROLE_USER:

  • В Spring Security 2: вы можете использовать атрибут areNotGranted тега <sec:authorize> (см. Документация по Spring Security 2
  • В Spring Security 3: выможно использовать Spring EL для оценки отрицательного состояния: access="!hasRole('ROLE_USER')"
...