Внезапно Spring security запомнить меня опция перестала работать. Теперь, когда я проверяю «запомнить меня» флажок на странице входа в систему и затем закрываю свой браузер, он просит меня войти снова, а не просто восстанавливать мою сессию.
Дальнейшее расследование показало, что:
- Он по-прежнему создает новые поля series / token / last_used в БД, но никогда не обновляет его. Поэтому каждый раз, когда я вхожу с тем же именем пользователя, он просто создает новую запись. Если я выхожу из системы, он очищает все записи токенов пользователя.
- Сначала он создает запомнить меня cook ie, но теряет его после закрытия браузера.
- Это не ошибка браузера.
- Он никогда не вызывает updateToken или getTokenForSeries методы JDBCTokenRepositoryImpl. Просто createNewToken при установленном флажке и removeUserTokens при выходе из системы.
- Это не вызывает loadUserByUsername метод реализации UserDetailsService
- Если я переключаюсь с JDBCTokenRepository на InMemoryTokenRepository, он все равно не работает. Поэтому я считаю, что это не ошибка, связанная с БД.
Теперь я застрял, что еще я могу сделать, чтобы восстановить "запомнить меня" функциональность? Буду признателен за любые рекомендации для дальнейшего расследования.
UserDetailsService
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
UserService userService;
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
Optional<User> optusr = userService.findByName(userName);
if (!optusr.isPresent()) {
throw new UsernameNotFoundException("User not found");
}
User usr = optusr.get();
System.out.println (usr.getUsername());
System.out.println (userService.getRolesByString(usr));
return usr;
}
}
WebSecurityConfig
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserService userService;
@Autowired
UserDetailsServiceImpl userDetailsService;
/* @Autowired
private DataSource dataSource; */
@Bean
public BCryptPasswordEncoder passwordEncoder() {
//Password encoder settings to avoid storing plain passwords in DB
return new BCryptPasswordEncoder();
}
@Bean
public PersistentTokenRepository persistentTokenRepository() {
//Choose where to save user session: DB or memory (in our case: DB)
//JdbcTokenRepositoryImpl db = new JdbcTokenRepositoryImplCust();
//db.setDataSource(dataSource);
InMemoryTokenRepositoryImpl db = new InMemoryTokenRepositoryImpl();
return db;
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
//Settings service to find User in DB + password
auth
.userDetailsService(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//Main method for Spring's web security
http
// URL checks
.authorizeRequests()
.antMatchers("/resource/**").permitAll()
.antMatchers("/users").hasRole("ADMIN") //Only users with Admin Role can see it
.anyRequest().authenticated() //All another URL requires authorization
.and()
// Login forms
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/main")//Redirect page if
.failureUrl("/login?error")
.usernameParameter("username") //parse from POST
.passwordParameter("password") //parse from POST
.permitAll()
.and()
// Actions when logoff
.logout()
.permitAll()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.invalidateHttpSession(true)
.and()
// Exceptions
.exceptionHandling()
.accessDeniedPage("/denied")
.and()
//Cookies
.rememberMe()
.tokenRepository(this.persistentTokenRepository()) //Choose sessions repository
.rememberMeParameter("remember-me")
.alwaysRemember(true) //- always remember ignoring checkbox
.tokenValiditySeconds(1 * 24 * 60 * 60) //24H
.userDetailsService(userDetailsService)
;
}
}