Remember-me в Spring Security не работает

Рейтинг: -1Ответов: 1Опубликовано: 16.06.2023

Столкнулся со следующей проблемой: при попытке удаления JSESSIONID или перезапуске браузера, следующий запрос на сервер обнуляет remember-me Cookie и не подтверждает сессию.

        http
            .authenticationManager(authManager(http))
            .authorizeHttpRequests()
            .requestMatchers("/auth/sendCode", "/login").permitAll()
            .requestMatchers("/api/*").hasAuthority("USER")
            .anyRequest()
            .authenticated()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
            .and()
            .formLogin().passwordParameter("code").usernameParameter("email")
            .successHandler((request, response, authentication) -> {
                response.setStatus(HttpServletResponse.SC_OK);
            }).failureHandler((request, response, exception) -> response.setStatus(HttpServletResponse.SC_UNAUTHORIZED))
            .permitAll()
            .and()
            .logout()
            .logoutSuccessUrl("/")
            .deleteCookies("JSESSIONID")
            .and()
            .rememberMe()        .tokenRepository(persistentTokenRepository())
.userDetailsService(userDetailsService())
            .alwaysRemember(true)
            .tokenValiditySeconds(24*60*60*14)
            .key("Mykey");
    return http.build();

    @Bean
public PersistentTokenRepository persistentTokenRepository(){
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setDataSource(dataSource);
    return tokenRepository;
}

При запросе по любому из путей авторизованного пользователя выдаётся 401 из exceptionHandling(). В заголовках ответа приходит два Set-Cookie подряд:

Set-Cookie: remember-me=; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Set-Cookie: remember-me=aFRLMWhLYkhmNzVLMWh6M2I0b2ZYQSUzRCUzRDo2Snd1ZWFkcTFZRGlzZXp4RjAwRHlBJTNEJTNE; Max-Age=1209600; Expires=Thu, 29-Jun-2023 23:40:17 GMT; Path=/; HttpOnly

В БД таблица есть и каждый раз создаётся новый токен remember-me: Токены в БД

Пожалуйста, подскажите, в чём может быть проблема? UPD: Под следующим запросом я имею в виду тот запрос, который происходит после удаления JSESSION куки. Без её удаления всё работает штатно.

Ответы

▲ 0Принят

Проблема решилась так:

UserDetailsService использует запрос к репозиторию, ищет пользователя по email. Spring передавал расшифрованный email правильно, но добавлял перенос строки.

Пока что заменил так:

repo.findByEmail(email.replaceAll("\n","")

После этого пользователь стал находится, сессия подтверждаться. Посмотрю откуда взялся перенос строк и, если что, дополню ответ.