2015-01-05 17 views
5

Ich habe eine Feder-Web-Anwendung und ich habe Benutzer-Authentifizierung mit Spring-Sicherheit.Ausloggen automatisch mit Spring Security

Alles funktioniert gut. An- und abmelden funktioniert perfekt!

Jetzt möchte ich implementieren, um sich automatisch abzumelden. Wenn der Benutzer beispielsweise ein Fenster für ungefähr 30 Minuten geöffnet hat und nichts unternimmt (Sitzungen sind zum Beispiel abgelaufen), sollte sich das System automatisch abmelden. Wie kann ich das umsetzen?

Es könnte von Client-Seite implementiert werden (Ich sende Anfragen alle 1 Minuten und überprüfen, ob die Sitzung beendet ist). Aber kann ich das nicht automatisch ab Frühling machen?

Ich habe diese config:

<http auto-config="true" use-expressions="true"> 


     <intercept-url pattern="/admin**" /> 
     <access-denied-handler error-page="/403" /> 

     <form-login login-page="/login" 
      default-target-url="/admin" 
      authentication-failure-url="/login?error" 
      username-parameter="NAME" 
      password-parameter="PASSWORD" /> 

     <logout invalidate-session="true" 
      logout-success-url="/login?logout"/> 

    </http> 

und in web.xml

<session-config> 
    <session-timeout>1</session-timeout> 
</session-config> 

nach 1 Minute, ich sehe, dass Sitzung zerstört wurde. Beenden Sie die Sitzung nach 1 Minute. aber konnte nicht umgeleitet/Login Logout

+1

Wenn Sie eine Anfrage prüfen, d. H. Eine Anfrage stellen, wird die Sitzung nicht jede Minute ablaufen, da jede Minute Aktivität besteht. Polling nicht und lassen Sie die Sitzung Zeitüberschreitung und für Frühling Sicherheit geben Sie die ungültige Sitzungs-URL auf dem 'Session-Management'-Element. –

+0

danke! Können Sie mir sagen, wie ich die ungültige Sitzungs-URL angeben soll? Vielen Dank! – grep

Antwort

3

Wie über die Sicherheitskonfiguration verwenden ?? Ich hoffe unten Config: wird funktionieren.

applicationContext.xml

--namespace-> xmlns:security="http://www.springframework.org/schema/security" 

     <security:logout invalidate-session="true" 
         success-handler-ref="Logout" 
         logout-url="/logout.html" /> 
     </security:http> 

web.xml

<session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 

Und sie, müssen Sie Ihre eigenen, weil der Erfolg-Handler-ref = "Logout" ist Handler benutzerdefinierte schreiben für Abmeldung:
Abmelden @Komponente

public class Logout extends SimpleUrlLogoutSuccessHandler { 

    @Override 
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, 
      Authentication authentication) throws IOException, ServletException { 

     if (authentication != null) { 
      // do something 
     } 

     setDefaultTargetUrl("/login"); 
     super.onLogoutSuccess(request, response, authentication);  
    } 
} 
+0

können Sie mir sagen, was "success-handler-ref =" Logout "bedeutet? Ist" Logout "Zuordnung des Controllers? Zum Beispiel localhost: 8080/logout? Oder Was bedeutet "Abmelden"? – grep

+0

Ich habe meinen Code aktualisiert. Gibt es etwas, das verpasst wurde? – grep

+0

funktioniert immer noch? Kann verwendet werden, um eine Instanz von LogoutSuccessHandler zu liefern, die aufgerufen wird, um die Navigation nach dem Abmelden zu steuern. –

1

Sie können einen globalen Timeout-Wert verwenden, indem Sie diese in Ihren web.xml setzen:.

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 
+0

Dies legt nur einen Zeitraum fest, in dem die Sitzung beendet werden soll (zerstören). Zum Beispiel, wenn ich 1 setze, wird nach 1 Minute Sitzung sterben (destory). ABER ich möchte automatisch auf/logout Seite umleiten, wenn Sitzung zerstört wird. – grep

+0

Das funktioniert aber was ist mit Ajax-Anrufen? Wenn ein Ajax-Anruf getätigt wird, kann die Webseite nicht zur Anmeldeseite umgeleitet werden. – grep

+0

Ich bin nicht sicher, ob es eine einfache Möglichkeit, es automatisch zu tun ist –

0

Hier ist das Tutorial, das ich verwendet habe. Es gibt Java Script und Server Side Code. Der Server berechnet, wann die Sitzung abläuft und sendet sie als Cookie zurück. Dann überprüft das Java-Skript alle 10 Sekunden, ob es abgelaufen ist, wenn dies der Fall ist, wird window.close(). http://www.javaworld.com/article/2073234/tracking-session-expiration-in-browser.html

Hier ist, wie ich es implementiert

SessionTimeout.js

/** 
* Monitor the session timeout cookie from Apache and log the user out when expired 
*/ 
"use strict"; 

var jQuery = require("jquery").noConflict(); 
var jsCookie = require("js-cookie"); 

module.exports.registerListener = function() { 
    calcOffset(); 
    checkSession(); 
}; 

/** 
* We can't assume the server time and client time are the same 
* so lets calcuate the difference 
*/ 
function calcOffset() { 
    var serverTime = jsCookie.get('serverTime'); 
    serverTime = serverTime==null ? null : Math.abs(serverTime); 
    var clientTimeOffset = (new Date()).getTime() - serverTime; 
    jsCookie.set('clientTimeOffset', clientTimeOffset); 
} 

/** 
* Check the sessionExpiry cookie and see if we should send the user to/
*/ 
function checkSession() { 
    var sessionExpiry = Math.abs(jsCookie.get('sessionExpiry')); 
    var timeOffset = Math.abs(jsCookie.get('clientTimeOffset')); 
    var localTime = (new Date()).getTime(); 
    if(!sessionExpiry){ 
     window.console.log("Unknown session sessionExpiry"); 
     return; 
    } 
    if (localTime - timeOffset > (sessionExpiry+15000)) { // 15 extra seconds to make sure 
     window.location = "/login"; 
     jsCookie.remove('sessionExpiry'); 
    } else { 
     setTimeout('checkSession()', 10000); 
    } 
    window.console.log("Session expires in " + ((sessionExpiry+15000) - localTime - timeOffset) + "ms"); 
} 

window.checkSession = checkSession; //Used for recalling via setTimeout 

SessionTimeoutCookieFilter.

java
public class SessionTimeoutCookieFilter implements Filter { 

    private static final Logger LOG = LoggerFactory.getLogger(SessionTimeoutCookieFilter.class); 

    @Override 
    public void init(FilterConfig config) throws ServletException { 
     LOG.info("Initialization SessionTimeoutCookieFilter"); 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException { 
     HttpServletResponse httpResp = (HttpServletResponse) resp; 
     HttpServletRequest httpReq = (HttpServletRequest) req; 

     long currTime = System.currentTimeMillis(); 
     String expiryTime = Long.toString(currTime + httpReq.getSession().getMaxInactiveInterval() * 1000); 
     Cookie cookie = new Cookie("serverTime", Long.toString(currTime)); 
     cookie.setPath("/"); 
     httpResp.addCookie(cookie); 
     if (httpReq.getRemoteUser() != null) { 
      cookie = new Cookie("sessionExpiry", expiryTime); 
     } 
     cookie.setPath("/"); 
     httpResp.addCookie(cookie); 

     filterChain.doFilter(req, resp); 
    } 

In den Filter

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
... 
    @Override 
    protected Filter[] getServletFilters() { 
     return new Filter[]{new SessionTimeoutCookieFilter()}; 
    } 
} 
0

So leitet den "ungültig-session-url" Tag zu Ihrem "Session-Management" bean in Sicherheitskontext Login-Seite nach einer Sitzung Ablauf hinzufügen:

In meinem Fall, ich umleiten auf Fehler-Login-Seite, wo eine Fehlermeldung angezeigt wird und ich kann mich erneut anmelden. Beachten Sie, dass Sie beim Ablauf der Sitzung nicht automatisch umgeleitet werden. Sie müssen auf einen beliebigen Teil Ihrer Seite klicken und die Umleitung wird ausgelöst.