2016-12-20 28 views
2

右後登記(註冊),我登錄我的用戶編程通過Spring安全:沒有Spring Security的記住我創建的cookie登錄時編程

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

這工作得很好,但它不會創建記住我的cookie(儘管使用交互式登錄cookie創建的很好)。

現在,我已經讀thisthis答案,那你必須在導線的RememberMeServices實施(我用PersistentTokenBasedRememberMeServices),然後調用onLoginSuccess。我沒有成功autowire PersistentTokenBasedRememberMeServices

如何使這項工作?這是正確的方式嗎?爲什麼Spring Security不提供更方便的方法?


P.S:這是從我配置的摘錄:

@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() 
      .... 
     ... 
    } 
} 

回答

3

你沒有提到的Spring版本。下面的配置將適用於Spring 4,但您可以修改其他版本。在您的WebSecConf類自動導線PersistentTokenRepositoryUserDetailsService接口。添加Bean獲取PersistentTokenBasedRememberMeServices實例。

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

現在您的控制器或類,你正在做的編程登錄,自動裝配PersistentTokenBasedRememberMeServices,並添加下面的代碼裏面的方法來調用loginSuccess方法。

@Autowired 
PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices; 

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

謝謝您的回答!我認爲,這可能是一個好方法。唯一的問題是,persistentTokenBasedRememberMeServices沒有連接 - 當調用persistentTokenBasedRememberMeServices.loginSuccess(request,response,auth)時,我得到一個'NullPointer-Exception'' – olivmir

+0

PS:我使用Spring 4. – olivmir

+1

一旦你定義了「@ Bean「,因爲我發佈的WebSecConf類中的PersistentTokenBasedRememberMeServices不應該爲null,因爲它在Controller中自動裝入它時不應該爲空。 – abaghel