2011-03-28 48 views
8

Estamos teniendo dos formas de iniciar sesión.Spring Security: Redirigir a la página de inicio de sesión si la autenticación falló

  • El nombre de usuario y la contraseña son enviados por otra aplicación en los encabezados de solicitud. IT se examina y si el nombre de usuario y la contraseña son correctos, entra. [Se escribe un filtro personalizado]
  • Si el nombre de usuario y la contraseña no están presentes en los encabezados de solicitud, se muestra la pantalla de inicio de sesión.
  • Cuando el nombre de usuario y la contraseña están presentes en el encabezado de la solicitud y si su mal, se me muestra un estado HTTP 401 - Error de autenticación: Bad credenciales página.

    Cómo hago que muestre la página de inicio de sesión en caso de que falle la autenticación.

    A continuación se muestra el código de la security.xml

    <http auto-config="true" use-expressions="true"> 
          <access-denied-handler error-page="/login.jsp"/> 
          <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/> 
          <intercept-url pattern="/*" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"/> 
          <custom-filter ref="requestHeaderFilter" before="FORM_LOGIN_FILTER"/> 
          <form-login login-page="/login.jsp"/> 
    
        </http> 
    

    Por favor, hágamelo saber si usted necesita más información.

    Editar: Añadiendo el código para el filtro RequestHeader en mi solicitud

    public class RequestHeaderProcessingFilter extends AbstractAuthenticationProcessingFilter{ 
    
    private String usernameHeader = "j_username"; 
    private String passwordHeader = "j_password"; 
    
    
    protected RequestHeaderProcessingFilter() { 
        super("/login_direct"); 
    } 
    
    //getters and setters 
    
    @Override 
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { 
        String username = request.getHeader(usernameHeader); 
        String password = request.getHeader(passwordHeader); 
    
        SignedUsernamePasswordAuthenticationToken authRequest = 
         new SignedUsernamePasswordAuthenticationToken(username, password); 
    
         return this.getAuthenticationManager().authenticate(authRequest); 
    } 
    

    }

    Respuesta

    0

    El comportamiento por defecto en caso de fallo de autenticación es para mostrar el estado HTTP 401. En caso SimpleUrlAuthenticationFailureHandler se utiliza para controlar los errores (como se realizado por AbstractAuthenticationProcessingFilter, este comportamiento puede ser anulado por el establecimiento de la defaultFailureUrl a /login.jsp.

    Alternativamente, un manipulador personalizado se puede definir con sui acción de mesa.

    +0

    Hola Raghuram, gracias. ¿dónde configuro defaultFailureUrl? ¿Tengo que conectarlo, en el código que he proporcionado arriba? – vinoth

    +0

    @vinoth. Depende de la implementación de la implementación 'requestHeaderFilter'. Las clases mencionadas en la respuesta muestran una forma de hacerlo – Raghuram

    +0

    Hola, he agregado la implementación de requestHeaderFilter. ¿Deberíamos hacer cambios en eso? – vinoth

    2

    Para mostrar la página de inicio de sesión en caso de que el fallo de autenticación que debe tener la misma dirección URL en el <access-denied-handler error-page="/login.jsp"/> y la <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>

    por ejemplo:

    <global-method-security secured-annotations="enabled" /> 
    
    <http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 
        <logout logout-success-url="/app/sesiones/login" /> 
        <form-login 
         authentication-failure-url="/app/sesiones/login?error=true" 
         login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" /> 
        <intercept-url pattern="/app/privados/*" access="ROLE_USER" /> 
    </http> 
    

    en ese ejemplo, el usuario también se redirige a página de inicio de sesión después de que él cierra sesión. El/retrasoLogin es un método que envió al usuario lo login.jsp página.

    Cuestiones relacionadas