[Keycloak] OAuth2 MSA에서 키클록 SSO Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정

2022. 12. 27. 12:28·Spring
목차
  1. 개발환경
  2. 1. MSA 서비스 구조
  3. 2. gateway 서비스 설정
  4. 3. 서비스 설정 (security config 파일  추가)
  5. 4. auth 서비스 추가 설정 (keycloak-admin-client)
728x90

개발환경

  • macOS
  • Spring Boot 2.7.5 RELEASE
  • JAVA 11

 


1. MSA 서비스 구조

서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를 통해 각 서비스의 api를 호출하는 형태입니다.
auth 서비스를 통해 회원가입/로그인 등 계정 및 권한을 관리합니다. (키클록 토큰 발급)

 

 

2. gateway 서비스 설정

0) 프로젝트 구조

📦gatewayserver
┣ 📂src
┃┣ 📂main
┃ ┃ ┣ 📂java
┃ ┃ ┃ ┗ 📂com
┃ ┃ ┃ ┃ ┗ 📂cloud
┃ ┃ ┃ ┃ ┃ ┗ 📂gatewayserver
┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜GatewayserverApplication.java
┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SecurityConfig.java
┃ ┃ ┗ 📂resources
┃ ┃ ┃ ┗ 📜application.yml
┗ 📜pom.xml

 

1) pom.xml

spring-boot-starter-oauth2-client 추가

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

dependencyManagement에 keycloak-adapter-bom 추가

<dependency>
    <groupId>org.keycloak.bom</groupId>
    <artifactId>keycloak-adapter-bom</artifactId>
    <version>17.0.1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

 

2) application.yml

  • spring security 설정 추가
spring:
  security:
    oauth2:
      client:
        provider:
          keycloak:
            issuer-uri: http://localhost:5010/realms/team_cloud
            # issuer-uri: http://설정한 키클록url:port/realms/ream 이름
        registration:
          keycloak:
            client-id: team_cloud_client
            # client-id: client 이름
            client-secret: #keycloak client 비밀번호
            authorization-grant-type: authorization_code
            redirect-uri: '{baseUrl}/login/oauth2/code/keycloak'

 

  • keycloak 설정 추가
keycloak:
  realm: team_cloud
  # realm: realm 이름
  resource: team_cloud_client
  # resource: client 이름
  auth-server-url: http://localhost:5010/
  # auth-server-url: http://설정한 키클록url:port/

 

3) SecurityConfig.java 생성

package com.cloud.gatewayserver;


import lombok.AllArgsConstructor;
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;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange().pathMatchers("/**").permitAll()
                .and().authorizeExchange().anyExchange().authenticated()
                .and().oauth2Login()
                .and().csrf().disable();

        return http.build();
    }
}

 

3. 서비스 설정 (security config 파일  추가)

  • 각 서비스에 config 파일을 추가해야함
📦survey
 ┣ 📂src
 ┃ ┣ 📂main
 ┃ ┃ ┣ 📂java
 ┃ ┃ ┃ ┗ 📂com
 ┃ ┃ ┃ ┃ ┗ 📂cloud
 ┃ ┃ ┃ ┃ ┃ ┗ 📂survey
 ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂config
 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SurveyConfig.java
 ┃ ┃ ┃ ┃ ┃ ┃ ┣ ...
 ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜SurveyApplication.java
 ┃ ┃ ┗ 📂resources
 ┃ ┃ ┃ ┣ 📜application.yml
 ┗ 📜pom.xml

1) pom.xml

  • spring-boot-starter-oauth2-resource-server
  • spring-boot-starter-security
  • keycloak-spring-boot-starter dependency
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>17.0.1</version>
</dependency>
  • dependencyManagement에 keycloak-adapter-bom
<dependency>
    <groupId>org.keycloak.bom</groupId>
    <artifactId>keycloak-adapter-bom</artifactId>
    <version>17.0.1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

 

2)application.yml

  • spring security 설정 추가
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: http://localhost:5010/realms/team_cloud/protocol/openid-connect/certs
          # jwk-set-uri: http://설정한 키클록url:port/realms/team_cloud/protocol/openid-connect/certs

 

  • keycloak 설정 추가
keycloak:
  realm: team_cloud
  # realm: realm 이름
  bearer-only: true
  ssl-required: external
  resource: team_cloud_client
  # resource: client 이름
  auth-server-url: http://localhost:5010/
  #  auth-server-url: ttp://설정한 키클록url:port/
  credentials:
    secret: # keycloak client 비밀번호

 

3) SurveyConfig.java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SurveyConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .authorizeRequests()
                .antMatchers("/v1/survey/**", "/v1/answer/**").permitAll()
                .and().oauth2ResourceServer()
                .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter()))
                .and().csrf().disable()
        ;
}

    private Converter<Jwt, ? extends AbstractAuthenticationToken> jwtAuthenticationConverter() {
        JwtAuthenticationConverter jwtConverter = new JwtAuthenticationConverter();
        jwtConverter.setJwtGrantedAuthoritiesConverter(new RealmRoleConverter());
        return jwtConverter;
    }

    public class RealmRoleConverter implements Converter<Jwt, Collection<GrantedAuthority>> {
        @Override
        public Collection<GrantedAuthority> convert(Jwt jwt) {
            final Map<String, List<String>> realmAccess = (Map<String, List<String>>) jwt.getClaims().get("realm_access");
            return realmAccess.get("roles").stream().map(roleName -> "ROLE_" + roleName)
                    .map(SimpleGrantedAuthority::new).collect(Collectors.toList());
        }
    }
}

 

4. auth 서비스 추가 설정 (keycloak-admin-client)

0. 프로젝트 구조

📦auth
 ┣ 📂src
 ┃ ┣ 📂main
 ┃ ┃ ┣ 📂java
 ┃ ┃ ┃ ┗ 📂com
 ┃ ┃ ┃ ┃ ┗ 📂cloud
 ┃ ┃ ┃ ┃ ┃ ┗ 📂auth
 ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📂config
 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜AuthConfig.java
 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜KeycloakConfiguration.java
 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜MapperConfig.java
 ┃ ┃ ┃ ┃ ┃ ┃ ┣ ...
 ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜AuthApplication.java
 ┃ ┃ ┃ ┗ 📜application.yml
 ┗ 📜pom.xml

 

1) pom.xml

  • spring-boot-starter-oauth2-resource-server(모든 서비스에 추가)
  • spring-boot-starter-security(모든 서비스에 추가)
  • keycloak-spring-boot-starter (모든 서비스에 추가) 
  • keycloak-admin-client (auth 서비스에 추가)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>17.0.1</version>
</dependency>
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-admin-client</artifactId>
    <version>17.0.1</version>
</dependency>

 

  • dependencyManagement에 keycloak-adapter-bom (모든 서비스에 추가) 추가
<dependency>
    <groupId>org.keycloak.bom</groupId>
    <artifactId>keycloak-adapter-bom</artifactId>
    <version>17.0.1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

 

2) AuthConfig.java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class AuthConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/**").permitAll()
                .and().oauth2ResourceServer()
                .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter()))
                .and().csrf().disable()

        ;
    }

    private Converter<Jwt, ? extends AbstractAuthenticationToken> jwtAuthenticationConverter() {
        JwtAuthenticationConverter jwtConverter = new JwtAuthenticationConverter();
        jwtConverter.setJwtGrantedAuthoritiesConverter(new RealmRoleConverter());
        return jwtConverter;
    }

    public class RealmRoleConverter implements Converter<Jwt, Collection<GrantedAuthority>> {
        @Override
        public Collection<GrantedAuthority> convert(Jwt jwt) {
            final Map<String, List<String>> realmAccess = (Map<String, List<String>>) jwt.getClaims().get("realm_access");
            return realmAccess.get("roles").stream().map(roleName -> "ROLE_" + roleName)
                    .map(SimpleGrantedAuthority::new).collect(Collectors.toList());
        }
    }
}

 

3) KeycloakConfiguration.java

@Configuration
public class KeycloakConfiguration {
    @Value("${keycloak.auth-server-url}")
    private String authServerUrl;

    @Value("${keycloak.realm}")
    private String realm;

    @Value("${keycloak.resource}")
    private String clientId;

    @Value("${keycloak.credentials.secret}")
    private String clientSecret;

    /*
     *  keycloak.json 대신에 Spring Boot yml 파일을 이용하도록 돕는다.
     * */
    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    /*
     *  Keycloak 서버와 통신하기 위한 클라이언트 빌더
     * */
    @Bean
    public Keycloak keycloak() {
        return KeycloakBuilder.builder()
                .serverUrl(authServerUrl)
                .realm(realm)
                .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
                .clientId(clientId)
                .clientSecret(clientSecret)
                .build();
    }
}

 


이렇게 설정은 끝입니다.

다음 포스팅으로 auth 서비스에서 로그인, 회원가입 토큰 발급과 각 서비스에서 헤더로 전송된 토큰 체크입니다.

 

[Keycloak] MSA에서 키클록 Spring Security 연동 (2) 토큰 발급, 토큰값 확인

[Keycloak] MSA에서 키클록 Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정 개발환경 macOS Spring Boot 2.7.5 RELEASE JAVA 11 1. MSA 서비스 구조 서비스 디스커버리 패턴으로 gateway 서비스(api gateway)를

karla.tistory.com

 

728x90
  1. 개발환경
  2. 1. MSA 서비스 구조
  3. 2. gateway 서비스 설정
  4. 3. 서비스 설정 (security config 파일  추가)
  5. 4. auth 서비스 추가 설정 (keycloak-admin-client)
'Spring' 카테고리의 다른 글
  • 객체지향의 설계, SOLID 원칙
  • [Redis] Spring Boot 연동, 객체 캐싱, MSA에서 사용 시 주의점 Serialize
  • [Apache POI] Spring Boot 엑셀 다운로드
  • [Keycloak] MSA에서 키클록 Spring Security 연동 (2) 토큰 발급, 토큰값 확인
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    트리
    알고리즘
    이분탐색
    힙
    Algorithm
    정렬
    DP
    스택
    최대공약수
    프로그래머스
    그리디
    구현
    월간코드챌린지
    BFS
    최단거리
    파이썬
    LIS
    재귀
    DFS
    큐
    조합
    그래프
    자료구조
    덱
    구간합
    최소신장트리
    백준
    다익스트라
    동적계획법
    플로이드워셜
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[Keycloak] OAuth2 MSA에서 키클록 SSO Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.