Весна - не настойчиво запомни меня не выживает при перезапуске приложения
Я добавил функцию "Помни меня" в свое приложение Spring Boot 2. Первоначально я добавил его, используя постоянный механизм, но заметил, что в постоянной таблице только одна строка для одного пользователя, поэтому он не будет работать, если вы войдете в два разных браузера. Это проблематично, потому что мы часто используем приложение для разработки и тестирования с одинаковыми учетными записями.
Поэтому я добавил опцию application.properties, чтобы включить постоянный механизм только в рабочей среде. Теперь с cookie только помните, что я работаю также на двух разных браузерах, но я заметил, что он не работает при перезапуске приложения.
Это ожидаемое поведение? Нет ли способа, чтобы не переставать помнить меня при перезапуске сервера?
Это часть моей конфигурации:
@Value("${remember_me.cookie_only}")
private boolean remember_me_cookie_only;
@Autowired
public DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers(...)
;
http.authorizeRequests().and().exceptionHandling().accessDeniedPage("/accessDenied");
http.authorizeRequests().and().formLogin()
// Submit URL of login page.
.loginProcessingUrl("/j_spring_security_check") // Submit URL
.loginPage("/loginMe")//
.defaultSuccessUrl("/loginOK",true)//
.failureUrl("/loginMe?error=true")//
.usernameParameter("username")//
.passwordParameter("password")
.failureHandler(customAuthenticationFailureHandler())
.and()
.rememberMe()
.rememberMeParameter("remember-me")
.rememberMeCookieName("remember-me")
.tokenValiditySeconds(24 * 60 * 60)
.and()
.logout()
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.logoutUrl("/logout")
.logoutSuccessUrl("/loginMe")
.logoutSuccessHandler(logoutSuccessHandler())
.and()
.sessionManagement()
.invalidSessionUrl("/timeout");
if (! remember_me_cookie_only) {
http.rememberMe().tokenRepository(persistentTokenRepository());
}
@Bean
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
return tokenRepository;
}
1 ответ
Похоже, вы не устанавливаете ключ запомнить меня. Если он не установлен, Spring Security будет генерировать новый ключ при каждом запуске, что делает предыдущие файлы cookie, запоминаемые мной, недействительными.
.rememberMe()
.key("mySecretKey")
(Заменить "mySecretKey"
со случайной, но постоянной строкой.)