Spring Remember Me не восстанавливает сессию - PullRequest
0 голосов
/ 23 марта 2020

Внезапно Spring security запомнить меня опция перестала работать. Теперь, когда я проверяю «запомнить меня» флажок на странице входа в систему и затем закрываю свой браузер, он просит меня войти снова, а не просто восстанавливать мою сессию.

Дальнейшее расследование показало, что:

  1. Он по-прежнему создает новые поля series / token / last_used в БД, но никогда не обновляет его. Поэтому каждый раз, когда я вхожу с тем же именем пользователя, он просто создает новую запись. Если я выхожу из системы, он очищает все записи токенов пользователя.
  2. Сначала он создает запомнить меня cook ie, но теряет его после закрытия браузера.
  3. Это не ошибка браузера.
  4. Он никогда не вызывает updateToken или getTokenForSeries методы JDBCTokenRepositoryImpl. Просто createNewToken при установленном флажке и removeUserTokens при выходе из системы.
  5. Это не вызывает loadUserByUsername метод реализации UserDetailsService
  6. Если я переключаюсь с 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)
            ;
    }
}
...