Spring Security - 需要403错误,而不是重定向

art*_*emb 38 spring spring-security

我正在使用Spring Security 3.0.4.我有一堆受Spring Security保护的Web服务.当我以未经身份验证的用户身份访问它们时,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>
Run Code Online (Sandbox Code Playgroud)

Bar*_*cki 15

对于java配置,您需要这样做

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint);
Run Code Online (Sandbox Code Playgroud)

WhereSendUnauthorized401AuthenticationEntryPoint是天堂级的

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会禁用Spring的默认行为(将未经身份验证的请求重定向到登录表单).

附注:对于这种情况,HTTP代码SC_UNAUTHORIZED(401)是比SC_FORBIDDEN(403)更好的选择.


tzr*_*rlk 10

有一个在春天论坛上的一篇文章在这里,概述了如何让这两种方法之间您的应用程序确定.到目前为止,我使用以下代码来保护我的数据控制器:

<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>
Run Code Online (Sandbox Code Playgroud)

因此,我链接的文章中的整个DelegatingAuthenticationEntryPoint解决方案有点重量级,但我认为它的工作也很好.


use*_*4ce 9

(老问题,但值得回答.)

基本上,你需要

  • 创建一个RequestMatcher以确定哪些请求应该获得403(AntPathRequestMatcher在您的情况下可能就足够了).
  • 配置HttpSessionRequestCache以检查匹配器,而不是存储这些页面以进行登录后重定向.
  • DelegatingAuthenticationEntryPoint根据匹配器使用a 来直接请求403或重定向登录.

看这里的例子:

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


Jav*_*avi -4

它应该返回 403 错误,除非您将其配置为使用此标记转到另一个 url:

<sec:access-denied-handler error-page="/urlToGoIfForbidden" />
Run Code Online (Sandbox Code Playgroud)

  • 是的,提问者知道应该这样做,因为他问了这个问题。他问是因为事实并非如此。 (3认同)