Spring Session Redis не заменяет Tomcat JSESSIONID (два файла cookie сеанса)JAVA

Программисты JAVA общаются здесь
Anonymous
Spring Session Redis не заменяет Tomcat JSESSIONID (два файла cookie сеанса)

Сообщение Anonymous »

Я разрабатываю сервис BFF (Backend For Frontend) с использованием Spring. Для аутентификации я использую поставщика удостоверений (Keycloak для локальной разработки). Я использую поток кода авторизации через библиотеку Spring-boot-starter-oauth2-client. Для хранения сессий я решил использовать Redis, поэтому добавил Spring-session-data-redis.
Все работает нормально — сессии сохраняются в Redis корректно. Однако после входа в систему я вижу в своем браузере файлы cookie JSESSIONID и SESSION. В моем случае я считаю, что файл cookie JSESSIONID мне больше не нужен, поскольку я перешел на Spring Session.
Как файлы cookie выглядят в моем браузере:

JSESSIONID = 3C021B41252CCB3F191EC34CE46C7F8E

SESSION = ZjdmMDM2OWQtYmE2Ny00ZjBiLTkwOTAtMWY1ZmUzMDU4MDk5
Насколько я понимаю, JSESSIONID генерируется Apache Tomcat, а SESSION генерируется Spring Session. Я попробовал отладку, проверив все фильтры запросов, но до сих пор не понимаю, как предотвратить создание файла cookie JSESSIONID.
Поэтому у меня вопрос: как я могу предотвратить создание файла cookie JSESSIONID?
Ниже я предоставляю файлы SecurityConfig.java, build.gradle и application.yaml. Если вам нужна дополнительная информация о настройке моего проекта, дайте мне знать.
Я буду признателен за любую помощь, а также за ссылки на статьи или документацию, которые объясняют это более подробно.
P.S. Я нашел похожий вопрос здесь: Spring Sessions HttpSession не может полностью заменить JSESSIONID, но я не уверен, что ответы там отражают лучшие практики. Также я попробовал несколько из них, и они мне не помогли.
P.P.S. Я также проверил эту статью: Spring-session-data-redis не работает, но в ней также есть ответы для конфигурации на основе .xml. Я пытался упорядочить фильтры, используя: Spring:session:servlet:filter-order: -2147483648, но это тоже не помогло.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'

implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'

implementation 'org.springframework.boot:spring-boot-starter-webmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

spring:
security:
oauth2:
client:
registration:
shelfio:
clientId: ${IDP_CLIENT_ID}
clientSecret: ${IDP_CLIENT_SECRET}
scope: openid
redirect-uri: ${IDP_REDIRECT_URI}
provider:
shelfio:
issuerUri: ${IDP_ISSUER_URI}

session:
store-type: redis
timeout: 30m
redis:
namespace: shelfio:bff:session

data:
redis:
host: ${REDIS_HOST}
port: ${REDIS_PORT}
password: ${REDIS_PASSWORD}

logging:
level:
org.springframework.security: DEBUG
org.springframework.security.oauth2: DEBUG
org.springframework.security.oauth2.client: DEBUG
org.springframework.web.filter.CommonsRequestLoggingFilter: DEBUG

package org.shelfio.bff.config;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public class SecurityConfig {

/**
* CORS and CSRF implementation will be provided later.
*/
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
http.csrf(Customizer.withDefaults())
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/oauth2/**", "/login/oauth2/**").permitAll()
.anyRequest().authenticated())
.oauth2Login(Customizer.withDefaults())
.logout(logout -> logout
.deleteCookies("SESSION")
.logoutSuccessHandler((_, res, _) -> {
res.setStatus(HttpServletResponse.SC_OK);
}))
.sessionManagement(session -> session
.sessionFixation(SessionManagementConfigurer.SessionFixationConfigurer::migrateSession));
return http.build();
}
}

Вернуться в «JAVA»