@PreAuthorize при перенаправлении контроллера пружины, если авторизация не удалась - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть весенняя защита, успешно оценивающая @PreAuthorize на моем контроллере. Если я использую "allowAll", то я могу просмотреть страницу, и если я использую "isAuthenticated ()", я получу некрасивую трассировку Доступ запрещен. Если я поместил конфигурацию в URL-адрес перехвата в узле http в моем xml-файле конфигурации контекста безопасности, то меня перенаправят на страницу входа в систему, вместо того, чтобы прямо на моей странице получить неприятный след стека.

Могу ли я получить перенаправление только с помощью механизма аннотаций?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Я получил это на работу. Мне пришлось иметь дело с парой вещей.

Во-первых, в моей конфигурации Spring MVC был настроен SimpleMappingExceptionResolver с настройкой defaultErrorView. Это перехватывало ошибки аутентификации и авторизации, прежде чем они могли добраться до обработчика отказа в доступе, который я настроил в элементе http в моей конфигурации безопасности. Окончательный код выглядит примерно так.

securitycontext.xml

<global-method-security pre-post-annotations="enabled"/>

<!-- HTTP security configurations -->
<http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
    <access-denied-handler ref="myAccessDeniedHandler" />
    ... other configuration here ...
</http>

<!-- handler for authorization failure.  Will redirect to the login page. -->
<beans:bean id="myAccessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
    <beans:property name="errorPage" value="/index" />
</beans:bean>

обратите внимание, что loginUrlAuthenticationEntryPoint на самом деле не является частью решения, это обработчик отказа в доступе.

В моем mvc-config.xml все еще есть SimpleMappingExceptionResolver, но без настроенного defaultErrorView. Если бы я продолжил этот путь, я бы, вероятно, реализовал свой собственный SimpleMappingExceptionResolver, который позволял бы пропускать исключения аутентификации и авторизации, ИЛИ настраивал его вместо этого в SimpleMappingExceptionResolver.

Убийство в этой сделке заключается в том, что я не нашел способа настроить require-channel = "https" из intercept-url через аннотацию, поэтому я сейчас положу его в файл конфигурации xml в любом случае.

3 голосов
/ 15 ноября 2010

Вы можете настроить обработку ошибок, переопределив точку входа безопасности. Все исключения, которые происходят в цепочке фильтров (определяемой отображением, которое вы определяете в файле web.xml) для защищенных объектов, обнаруживаются и могут обрабатываться там. Если они не обработаны, то ExceptionTranslationFilter вступит во владение.

Вы можете определить свою собственную точку входа следующим образом:

public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.AuthenticationException authException) throws IOException, ServletException {

        if (authException != null) {
            // you can check for the spefic exception here and redirect like this
            response.sendRedirect("403.html");
        }
    }
}

Вы можете указать это как точку входа, установив эту точку входа в файле конфигурации xml:

<http entry-point-ref="customAuthenticationEntryPoint">

  ...

</http>

В вашем конкретном случае PreInvocationAuthorizationAdviceVoter будет вызываться любым AccessDecisionManager, который вы указали в своей конфигурации (обычно это один из следующих вариантов: AffirtivesBased, ConsensusBased или UnanimousBased). Вы увидите, что эти Избиратели выдают исключение AccessDeniedException, которое вы можете специально перехватить и обработать в своей точке входа.

Грант

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