2010-08-09 9 views
16

He estado utilizando Spring Security 3.0 para nuestro mecanismo de inicio de sesión de sitio web mediante una página web de inicio de sesión dedicada. Ahora necesito que esa página web de inicio de sesión sea en cambio una ventana de ventana/ventana emergente en cada página web de nuestro sitio, donde al iniciar sesión recibo un resultado de AJAX, ya sea que haya tenido éxito o no. ¿Cuál es la mejor manera de hacerlo con Spring Security y Spring webmvc 3.0?inicio de sesión ajax con spring webMVC y seguridad de primavera

Respuesta

13

En el lado del cliente, puede simular un envío de formulario normal a su url de inicio de sesión a través de ajax. Por ejemplo, en jQuery:

$.ajax({ 
    url: "${pageContext.request.contextPath}/j_spring_security_check", 
    type: "POST", 
    data: $("#loginFormName").serialize(), 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader("X-Ajax-call", "true"); 
    }, 
    success: function(result) { 
     if (result == "ok") { 
      ... 
     } else if (result == "error") { 
      ... 
     } 
    } 
}); 

En el lado del servidor, es posible personalizar AuthenticationSuccessHandlerAuthenticationFailureHandler y para devolver un valor en lugar de redirección. Debido a que es probable que tenga una página de inicio de sesión normal, así (por intento de acceder a una página segura a través de URL directa), debe informar a las llamadas ajax de llamadas normales, por ejemplo, el uso de cabecera:

public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler { 
    private AuthenticationSuccessHandler defaultHandler; 

    public AjaxAuthenticationSuccessHandler() { 

    } 
    public AjaxAuthenticationSuccessHandler(AuthenticationSuccessHandler defaultHandler) { 
     this.defaultHandler = defaultHandler; 
    } 

    public void onAuthenticationSuccess(HttpServletRequest request, 
     HttpServletResponse response, Authentication auth) 
     throws IOException, ServletException { 
    if ("true".equals(request.getHeader("X-Ajax-call"))) { 
     response.getWriter().print("ok"); 
     response.getWriter().flush(); 
    } else { 
     defaultHandler.onAuthenticationSuccess(request, response, auth); 
    } 
} 
} 
+0

no funcionó. el nombre de usuario y la contraseña son nulos por necesidad – gsagrawal

7

hice algo similar (axtavt gracias):

public class AjaxAuthenticationSuccessHandler extends 
    SimpleUrlAuthenticationSuccessHandler { 

public void onAuthenticationSuccess(HttpServletRequest request, 
     HttpServletResponse response, Authentication auth) 
     throws IOException, ServletException { 
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { 
     response.getWriter().print(
       "{success:true, targetUrl : \'" 
         + this.getTargetUrlParameter() + "\'}"); 
     response.getWriter().flush(); 
    } else { 
     super.onAuthenticationSuccess(request, response, auth); 
    } 
}} 

me eligió para extender la sencilla manejador éxito para el comportamiento predeterminado de las peticiones no Ajax. Aquí está el XML para hacerlo funcionar:

<http auto-config="false" use-expressions="true" entry-point-ref="authenticationProcessingFilterEntryPoint"> 
    <custom-filter position="FORM_LOGIN_FILTER" ref="authenticationFilter" /> 
... 
... 
</http> 

<beans:bean id="authenticationProcessingFilterEntryPoint" 
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <beans:property name="loginFormUrl" value="/index.do" /> 
    <beans:property name="forceHttps" value="false" /> 
</beans:bean> 

<beans:bean id="authenticationFilter" class= 
    "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager"/> 
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check"/> 
    <beans:property name="sessionAuthenticationStrategy" ref="sas" /> 
    <beans:property name="authenticationFailureHandler" ref="failureHandler"/> 
    <beans:property name="authenticationSuccessHandler" ref="successHandler"/> 
</beans:bean> 

<beans:bean id="successHandler" class="foo.AjaxAuthenticationSuccessHandler"> 
    <beans:property name="defaultTargetUrl" value="/login.html"/> 
</beans:bean> 

<beans:bean id="failureHandler" class="foo.AjaxAuthenticationFailureHandler" /> 
Cuestiones relacionadas