keycloak + spring security 로그아웃 구현 방법

뿌이·2022년 3월 27일
0

스프링 클라우드

목록 보기
32/32

진짜 엄청 해멨다...
대부분 HttpSecurity를 사용해서 내가 사용한 ServerHttpSecurity로는
어떻게 로그아웃 구현하는지 알수가없었다.
하지만 uri를 빌드해서 하는게 엄청나게 좋다는걸 알앗따.

시큐리티 로그아웃 하는 url은 기본적으로 /logout으로 설정되어있는데
로그아웃이 성공하면 logoutSuccessHandler에 의해
내가 설정한 uri인 키클락 세션 엔드포인트로 보내진다.

그럼 키클락 세션이 지워지면서 세션지우는게 성공하면 내가 보내준 redirect_uri 파라미터에 의해 redirect 된다.
이제 구현 코드를 보자

SecurityConfig.java

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;
       }

}

build.gradle

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()
}

도움이 되었다면 하트 부탁해요

profile
기록이 쌓이면 지식이 된다.

0개의 댓글