2010-08-09 3 views
16

Ich benutze Spring Security 3.0 für unsere Website Login-Mechanismus über eine dedizierte Login-Webseite. Jetzt brauche ich diese Login-Webseite, um stattdessen ein Lightbox/Popup-Fenster auf jeder Webseite unserer Website zu sein, wo ich beim Einloggen ein AJAX-Ergebnis bekomme, egal ob es erfolgreich war oder nicht. Was ist der beste Weg, dies mit Spring Security und Spring webmvc 3.0 zu tun?Ajax Login mit Frühling webMVC und Feder Sicherheit

Antwort

13

Auf der Client-Seite können Sie eine normale Formularübermittlung an Ihre Login-URL über Ajax simulieren. Zum Beispiel in 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") { 
      ... 
     } 
    } 
}); 

Auf der Serverseite können Sie anpassen AuthenticationSuccessHandler und AuthenticationFailureHandler Wert statt Umleitung zurückzukehren. Da Sie wahrscheinlich eine normale Login-Seite als auch (für Versuch, eine gesicherte Seite über eine direkte URL zuzugreifen) benötigen, sollten Sie Ajax-Aufrufe von normalen Anrufen sagen zum Beispiel Header mit:

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

ich habe das nicht funktioniert. Benutzername und Passwort werden von request null – gsagrawal

7

Ich habe etwas ähnliches (dank axtavt):

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

ich wählte den einfachen Erfolg Handler für das Standardverhalten auf nicht-Ajax-Anfragen zu erweitern. Hier ist das XML, damit es funktioniert:

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