2016-12-20 7 views
2

Recht nach Anmeldung (Anmeldung) Ich bin in meinem Benutzer programmatisch über Spring Security Anmeldung:No Spring Security Remember me Cookie erstellt beim Einloggen programmatisch

public register(HttpServletRequest request, String user, String password) { 
    ... 
    request.login(user, password); 
} 

Dies funktioniert gut, aber es nicht schaffen der Remember-Me-Cookie (obwohl beim interaktiven Login der Cookie gut erstellt wird).

Jetzt in this und this Antwort habe ich gelesen habe, dass Sie bei der Umsetzung von RememberMeServices zu Draht haben (ich benutze PersistentTokenBasedRememberMeServices) und dann onLoginSuccess nennen. Ich war nicht erfolgreich, um PersistentTokenBasedRememberMeServices zu autowire.

Wie funktioniert das? Ist das der richtige Weg? Warum Spring Security bietet keinen bequemeren Weg?


P. S .: Das ist ein Auszug aus meiner Konfiguration:

@Configuration 
@EnableWebSecurity 
public class WebSecConf extends WebSecurityConfigurerAdapter { 

    ... 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
      .rememberMe() 
       .tokenRepository(new MyPersistentTokenRepository()) 
       .rememberMeCookieName("rememberme") 
       .tokenValiditySeconds(60 * 60 * 24) 
       .alwaysRemember(true) 
       .useSecureCookie(true) 
       .and() 
      .... 
     ... 
    } 
} 

Antwort

3

Sie nicht das Frühlings Version erwähnt hat. Die untere Konfiguration funktioniert mit Spring 4, aber Sie können sie für andere Versionen ändern. In Ihrer WebSecConf Klasse Autowire PersistentTokenRepository und UserDetailsService Schnittstellen. Fügen Sie Bean hinzu, um PersistentTokenBasedRememberMeServices Instanz zu erhalten.

@Configuration 
@EnableWebSecurity 
public class WebSecConf extends WebSecurityConfigurerAdapter { 

@Autowired 
PersistentTokenRepository persistenceTokenRepository; 
@Autowired 
UserDetailsService userDetailsService; 
    ... 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
      .rememberMe() 
       .tokenRepository(persistenceTokenRepository) 
       .rememberMeCookieName("rememberme") 
       .tokenValiditySeconds(60 * 60 * 24) 
       .alwaysRemember(true) 
       .useSecureCookie(true) 
       .and() 
      .... 
     ... 
    } 

@Bean 
public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices() { 
    PersistentTokenBasedRememberMeServices persistenceTokenBasedservice = new PersistentTokenBasedRememberMeServices("rememberme", userDetailsService, persistenceTokenRepository); 
    persistenceTokenBasedservice.setAlwaysRemember(true); 
    return persistenceTokenBasedservice; 
    } 
} 

Jetzt in Ihrem Controller-oder Klasse, wo Sie programmatische Login tun, autowire PersistentTokenBasedRememberMeServices und unter Code innerhalb der Methode hinzufügen loginSuccess Methode aufzurufen.

@Autowired 
PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices; 

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null){ 
     persistentTokenBasedRememberMeServices.loginSuccess(request, response, auth); 
    } 
+0

Vielen Dank für Ihre Antwort! Ich denke, das könnte ein guter Ansatz sein. Das einzige Problem ist, dass 'persistantTokenBasedRememberMeServices' nicht verkabelt ist - ich bekomme eine' NullPointer-Exception' beim Aufruf von 'persistentTokenBasedRememberMeServices.loginSuccess (request, response, auth)' – olivmir

+0

PS: Ich benutze Spring 4. – olivmir

+1

Sobald Sie "@ Bean "für PersistentTokenBasedRememberMeServices in Ihrer WebSecConf-Klasse, wie ich es gepostet habe, sollte nicht null sein, wenn Sie es in Controller autowire. – abaghel

Verwandte Themen