鍵漏洩+springセキュリティログアウトの実現方法

13187 ワード

本当に頑張りました...
ほとんどの場合、私が使用しているサーバHttpSecurityは次のとおりです.
ログアウトの実現方法がわかりません.
しかしuriを構築するのはとても良いことを知っています.
デフォルトでは、システムがログアウトしたurlは/logoutに設定されています.
ログアウトに成功した場合はlogoutSuccessHandler
私が設定したuriの鍵管理セッションのエンドポイントに送信します.
では、鍵ロックセッションがクリアされると、セッションは私が送信したredirect uriパラメータにリダイレクトされます.
実装コードを見てみましょう

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()
}
もし助けがあれば、Heartをください.