2010-11-24 24 views
32

Estoy usando Spring Security 3.0.4. Tengo un montón de servicios web que están protegidos por Spring Security. Cuando accedo a ellos como un usuario no autenticado, Spring Security redirige a la página de inicio de sesión. En lugar de eso, quiero devolver el error HTTP 403. ¿Cómo puedo lograr eso?Spring Security - necesita error 403, no redirige

Aquí está mi configuración de seguridad:

<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> 
+0

¿Ha intentado eliminar la configuración de "autenticación-error-url" en el inicio de sesión de su formulario? – Gandalf

+0

¿Has encontrado una solución de trabajo? He escuchado que la forma de lograrlo es anulando "algunos filtros de Spring", pero sin ejemplo, y creo que debería ser posible configurarlo porque, p. Se espera que la aplicación AJAX desee hacer un registro personalizado en el canal JSON y los canales JSON para datos reaccionen con 403 sin ningún derecho de servicio. –

+0

Relacionado: http://stackoverflow.com/questions/3339431/how-to-handle-expired-session-using-spring-security-and-jquery – usethe4ce

Respuesta

-4

debería devolver un error de 403 a menos que se configura para ir a otra URL con esta etiqueta:

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

Sí, asker sabe que debería, porque le hizo esta pregunta. Y preguntó porque no es así. –

+1

Esta etiqueta funciona solo para usuarios AUTENTICADOS que no tienen suficientes PREVÍBULOS (lo que se encuentra en los documentos ...) – Mat

8

Hay un artículo en los foros de primavera here que describe cómo lograr que tu aplicación sea determinante entre los dos métodos. Hasta ahora estoy usando el siguiente código para asegurar controladores mis datos:

<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> 

Así que toda la solución DelegatingAuthenticationEntryPoint en el artículo vinculado es un poco más pesado, pero me imagino que hace el trabajo muy bien también.

+0

La solución en el artículo publicado ha resuelto este problema para mí. ¡Gracias! –

8

(pregunta antiguo, pero vale la pena contestador.)

Básicamente, es necesario

  • Crear una RequestMatcher para determinar qué solicitudes se conseguir un 403 (AntPathRequestMatcher puede ser suficiente en su caso).
  • Configure HttpSessionRequestCache para verificar el emparejador y no almacene esas páginas para la redirección posterior al inicio de sesión.
  • Utilice un DelegatingAuthenticationEntryPoint bien sea 403 para solicitar directamente o redirigir para iniciar sesión de acuerdo con el emparejador.

Véase el ejemplo aquí:

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

10

Para la configuración de Java que tiene que hacer

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint); 

Dónde alwaysSendUnauthorized401AuthenticationEntryPoint es innstance de clase

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); 
    } 
} 

Esto deshabilita el comportamiento predeterminado de Spring (redirige las solicitudes no autenticadas al formulario de inicio de sesión).

Nota al margen: para el código HTTP tal caso SC_UNAUTHORIZED (401) es mejor opción que SC_FORBIDDEN (403).