진짜 엄청 해멨다...
대부분 HttpSecurity를 사용해서 내가 사용한 ServerHttpSecurity로는
어떻게 로그아웃 구현하는지 알수가없었다.
하지만 uri를 빌드해서 하는게 엄청나게 좋다는걸 알앗따.
시큐리티 로그아웃 하는 url은 기본적으로 /logout으로 설정되어있는데
로그아웃이 성공하면 logoutSuccessHandler에 의해
내가 설정한 uri인 키클락 세션 엔드포인트로 보내진다.
그럼 키클락 세션이 지워지면서 세션지우는게 성공하면 내가 보내준 redirect_uri 파라미터에 의해 redirect 된다.
이제 구현 코드를 보자
package com.dream.gatewayservice.config;
import java.net.URI;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.authentication.logout.RedirectServerLogoutSuccessHandler;
import org.springframework.security.web.server.authentication.logout.ServerLogoutSuccessHandler;
@Configuration
public class SecurityConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().pathMatchers("/menu/**", "/product/**").permitAll().and().authorizeExchange()
.anyExchange().authenticated().and().oauth2Login();
http.logout().logoutUrl("/logout")
.logoutSuccessHandler(logoutSuccessHandler(
"http://너님의 ip주소:8080/auth/realms/MSA/protocol/openid-connect/logout?redirect_uri=http://localhost:8000/menu/list"))
; //이건 keycloak 세션 엔드포인트 주소인데, 파라미터로 redirect_uri 보내면 로그아웃
//성공 시 redirect_uri로 보내줌
http.csrf().disable();
return http.build();
}
public ServerLogoutSuccessHandler logoutSuccessHandler(String uri) {
RedirectServerLogoutSuccessHandler successHandler = new RedirectServerLogoutSuccessHandler();
successHandler.setLogoutSuccessUrl(URI.create(uri));
return successHandler;
}
}
plugins {
id 'org.springframework.boot' version '2.6.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.dream'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2021.0.1")
set('keyCloakVersion', "16.1.1")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
//webflux안에 security가 들어있는것으로 판단됨
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
//security 설정
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
//implementation 'org.keycloak:keycloak-spring-boot-starter'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
mavenBom "org.keycloak.bom:keycloak-adapter-bom:${keyCloakVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
도움이 되었다면 하트 부탁해요