2016-12-20 2 views
2

Сразу после регистрации (регистрация) Я входе в мой пользователь программно с помощью Spring Security:Нет Spring Security Запомнить меня печенье, созданный при входе в систему программно

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

Это прекрасно работает, но это не создает cookie с помпом-me (хотя с интерактивным входом cookie создается отлично).

Теперь я прочитал в this и this ответ, что вы должны проволоки в реализации RememberMeServices (я использую PersistentTokenBasedRememberMeServices), а затем вызвать onLoginSuccess. 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 класс autwire PersistentTokenRepository и UserDetailsService интерфейсов. Добавьте 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; 
    } 
} 

Теперь в вашем контроллере или классе, где вы делаете программный вход, autowire PersistentTokenBasedRememberMeServices и добавьте ниже код внутри метода для вызова метода loginSuccess.

@Autowired 
PersistentTokenBasedRememberMeServices persistentTokenBasedRememberMeServices; 

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

Спасибо за ваш ответ! Я думаю, это может быть хорошим подходом. Единственная проблема заключается в том, что 'persistentTokenBasedRememberMeServices' не подключен. Я получаю' NullPointer-Exception' при вызове 'persistentTokenBasedRememberMeServices.loginSuccess (запрос, ответ, auth)' – olivmir

+0

PS: Я использую Spring 4. – olivmir

+1

Как только вы определяете «@ Бин "для PersistentTokenBasedRememberMeServices в вашем классе WebSecConf, поскольку я опубликовал его, не должен быть пустым, если вы его автоустанавливаете в контроллере. – abaghel

Смежные вопросы