spring-security Spring Security -需要403错误,未重定向

mgdq6dx1  于 2022-11-11  发布在  Spring
关注(0)|答案(5)|浏览(179)

我正在使用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>
62lalag4

62lalag41#

对于java配置,您需要执行以下操作

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint);

其中alwaysSendUnauthorized401身份验证入口点是类的示例

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) 更好。

oyxsuwqo

oyxsuwqo2#

Spring论坛here上有一篇文章概述了如何让你的应用在这两种方法之间进行判断。

<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解决方案有点重量级,但我认为它也能很好地完成这项工作。

pjngdqdw

pjngdqdw3#

您需要

  • 创建一个RequestMatcher来确定哪些请求应该得到403(AntPathRequestMatcher在您的情况下可能足够了)。
  • HttpSessionRequestCache配置为检查匹配器,并且不存储这些页面用于登录后重定向。
  • 使用DelegatingAuthenticationEntryPoint直接对请求进行403处理,或者根据匹配器重定向到登录。

请参见此处的示例:
http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/

vbkedwbf

vbkedwbf4#

此解决方案对我很有效(reference

http
  ...
  .oauth2Login().permitAll()
  .and().exceptionHandling()
  .defaultAuthenticationEntryPointFor(
       new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED),
       new RequestHeaderRequestMatcher("X-Requested-With", "XMLHttpRequest"))
            ...
kx7yvsdv

kx7yvsdv5#

它应该返回403错误,除非您将其配置为转到具有以下标记的另一个URL:

<sec:access-denied-handler error-page="/urlToGoIfForbidden" />

相关问题