Spring Security - нужна ошибка 403, а не перенаправление - PullRequest
38 голосов
/ 24 ноября 2010

Я использую Spring Security 3.0.4. У меня есть несколько веб-сервисов, которые защищены Spring Security. Когда я обращаюсь к ним как к не авторизованному пользователю, Spring Security перенаправляет на страницу входа. Вместо этого я хочу вернуть ошибку HTTP 403. Как мне этого добиться?

Вот мой конфиг безопасности:

<http auto-config="false" use-expressions="true" >

    <intercept-url pattern="/authorization.jsp" access="permitAll"/>
    <intercept-url pattern="/registration.jsp" access="permitAll"/>
    <intercept-url pattern="/api/authorization/auth" access="permitAll"/>
    <intercept-url pattern="/api/authorization/new" access="permitAll"/>
    <intercept-url pattern="/api/accounts/new" access="permitAll"/>
    <intercept-url pattern="/app/**" access="permitAll"/>
    <intercept-url pattern="/extjs/**" access="permitAll"/>

    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />

    <form-login login-page="/authorization.jsp"
            default-target-url="/index.jsp"
            authentication-failure-url="/registration.jsp?login_error=1"
            always-use-default-target="true"
            />

    <logout logout-success-url="/authorization.jsp"
            logout-url="/j_spring_security_logout"
            invalidate-session="true"/>        

</http>

Ответы [ 4 ]

15 голосов
/ 19 июня 2015

Для настройки Java вам нужно сделать

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint);

Где всегдаSendUnauthorized401AuthenticationEntryPoint - это экземпляр класса

public class AlwaysSendUnauthorized401AuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public final void commence(HttpServletRequest request, HttpServletResponse response,
                               AuthenticationException authException) throws IOException {
        LOGGER.debug("Pre-authenticated entry point called. Rejecting access");
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
    }
}

Это отключает поведение Spring по умолчанию (перенаправление неаутентифицированных запросов в форму входа).

Примечание: в этом случае лучше использовать код HTTP SC_UNAUTHORIZED (401) , чем SC_FORBIDDEN (403) .

10 голосов
/ 19 марта 2012

На весенних форумах есть статья здесь , в которой описывается, как ваше приложение определяет между двумя методами. До сих пор я использую следующий код для защиты своих контроллеров данных:

<bean id="ep403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>

<sec:http pattern="/data/**" entry-point-ref="ep403" use-expressions="true">
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/>
</sec:http>

<bean id="epauth" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <constructor-arg value="/login.html"/>
</bean>

<sec:http pattern="/**" entry-point-ref="epauth" use-expressions="true">
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/>
</sec:http>

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

9 голосов
/ 02 ноября 2012

вам нужно

  • Создать RequestMatcher, чтобы определить, какие запросы должны получить 403 (AntPathRequestMatcher может быть достаточно в вашем случае).
  • Настройка HttpSessionRequestCacheчтобы проверить совпадение и не сохранять эти страницы для перенаправления после входа в систему.
  • Используйте DelegatingAuthenticationEntryPoint для прямого запроса 403 или перенаправьте для входа в систему в соответствии с совпадением.Смотрите пример здесь:

    http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/

0 голосов
/ 02 декабря 2010

Он должен возвращать ошибку 403, если вы не настроите его для перехода на другой URL с этим тегом:

<sec:access-denied-handler error-page="/urlToGoIfForbidden" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...