1. 개요

이 기사에서는 Keycloak 서버설정 하는 기본 사항 , Spring Boot 애플리케이션을 여기에 연결하는 방법, Spring Security와 함께 사용하는 방법에 대해 설명합니다 .

2. Keycloak은 무엇입니까?

Keycloak은 최신 애플리케이션 및 서비스를 대상으로하는 오픈 소스 ID 및 액세스 관리 솔루션입니다.

Keycloak은 SSO (Single-Sign-On), ID 브로커 링 및 소셜 로그인, 사용자 연합, 클라이언트 어댑터, 관리 콘솔 및 계정 관리 콘솔과 같은 기능을 제공합니다. Keycloak에 대해 자세히 알아 보려면 공식 페이지 를 방문 하십시오 .

사용방법(예제)에서는 Keycloak 클라이언트 어댑터를 사용하여 Spring Boot를 설정하고 연결하기 위해 Keycloak의 관리 콘솔을 사용합니다.

3. Keycloak 서버 설정

3.1. Keycloak 다운로드 및 설치

선택할 수있는 여러 배포판이 있습니다.

그러나이 사용방법(예제)에서는 독립 실행 형 버전을 사용합니다.

공식 소스에서 Keycloak-11.0.2 독립형 서버 배포판다운로드 해 보겠습니다 .

Standalone 서버 배포판을 다운로드했으면 터미널에서 압축을 풀고 Keycloak을 시작할 수 있습니다.

unzip keycloak-11.0.2.zip 
cd keycloak-11.0.2/bin
./standalone.sh -Djboss.socket.binding.port-offset=100

./standalone.sh를 실행 하면 Keycloak이 서비스를 시작합니다. Keycloak 11.0.2 (WildFly Core 12.0.3.Final)가 시작된 줄이 표시되면 시작이 완료되었음을 알 수 있습니다.

이제 브라우저를 열고 http : // localhost : 8180을 방문해 보겠습니다 . http : // localhost : 8180 / auth리디렉션되어 관리자 로그인을 생성합니다.

의라는 초기 관리 사용자 만들어 보자 initial1 암호로 zaq1! QAZ를 . Create를 클릭하면 User Created 메시지가 표시 됩니다.

이제 관리 콘솔로 이동할 수 있습니다. 로그인 페이지에서 초기 관리자 자격 증명을 입력합니다.

3.2. 영역 생성

성공적으로 로그인하면 콘솔로 이동하여 기본 마스터 영역이 열립니다 .

여기서는 사용자 지정 영역을 만드는 데 중점을 둘 것입니다.

영역 추가 버튼 을 찾기 위해 왼쪽 상단 모서리 로 이동해 보겠습니다 .

다음 화면에서 SpringBootKeycloak 이라는 새 영역을 추가해 보겠습니다 .

만들기 버튼을 클릭하면 새 영역이 생성되고 해당 영역으로 리디렉션됩니다. 다음 섹션의 모든 작업은이 새로운 SpringBootKeycloak 영역 에서 수행됩니다 .

3.3. 클라이언트 생성

이제 클라이언트 페이지로 이동합니다. 아래 이미지에서 볼 수 있듯이 Keycloak은 이미 내장 된 클라이언트와 함께 제공됩니다 .

하지만 애플리케이션에 새 클라이언트를 추가해야하므로 Create를 클릭 합니다. 새로운 클라이언트 로그인 앱을 호출합니다 .

다음 화면에서,이 예제, 우리는 제외한 모든 기본값을 떠날 수 있습니다 유효한 리디렉션 URI에의 필드. 이 필드에는 인증에이 클라이언트를 사용할 애플리케이션 URL이 포함되어야합니다 .

나중에이 클라이언트를 사용할 포트 8081에서 실행되는 Spring Boot 애플리케이션을 만들 것입니다. 따라서 위의 http : // localhost : 8081 / * 리디렉션 URL을 사용했습니다 .

3.4. 역할 및 사용자 생성

Keycloak은 역할 기반 액세스를 사용합니다. 따라서 각 사용자에게는 역할이 있어야합니다.

이를 위해 역할 페이지 로 이동해야 합니다.

그런 다음 사용자 역할을 추가합니다 .

이제 사용자에게 할당 할 수있는 역할이 있지만 아직 사용자가 없습니다. 이제 사용자 페이지 로 이동하여 하나를 추가해 보겠습니다 .

user1 이라는 사용자를 추가합니다 .

사용자가 생성되면 세부 정보가 포함 된 페이지가 표시됩니다.

이제 Credentials 탭으로 이동할 수 있습니다 . 초기 암호를 xsw2 @ WSX 로 설정합니다 .

마지막으로 역할 매핑 탭으로 이동합니다 . user1 에게 사용자 역할을 할당합니다 .

4. Keycloak의 API로 액세스 토큰 생성

Keycloak은 액세스 토큰을 생성하고 새로 고치기위한 REST API를 제공합니다. 이 API를 사용하여 자체 로그인 페이지를 쉽게 만들 수 있습니다.

먼저 다음 URL로 POST 요청을 전송하여 Keycloak에서 액세스 토큰을 획득해야합니다.

http://localhost:8180/auth/realms/SpringBootKeycloak/protocol/openid-connect/token

요청에는 x-www-form-urlencoded 형식의 본문이 있어야 합니다.

client_id:<your_client_id>
username:<your_username>
password:<your_password>
grant_type:password

이에 대한 응답으로 access_tokenrefresh_token을 얻습니다 .

액세스 토큰은 Authorization 헤더 에 간단히 배치하여 Keycloak으로 보호되는 리소스에 대한 모든 요청에서 사용해야합니다 .

headers: {
    'Authorization': 'Bearer' + access_token
}

액세스 토큰이 만료되면 위와 동일한 URL로 POST 요청을 보내지 만 사용자 이름과 비밀번호 대신 새로 고침 토큰을 포함하여 토큰을 새로 고칠 수 있습니다.

{
    'client_id': 'your_client_id',
    'refresh_token': refresh_token_from_previous_request,
    'grant_type': 'refresh_token'
}

Keycloak은 새로운 access_tokenrefresh_token으로 이에 응답합니다 .

5. 스프링 부트 애플리케이션 생성

5.1. 의존성

최신 Spring Boot Keycloak Starter 의존성은 Maven Central 에서 찾을 수 있습니다 .

Keycloak Spring Boot 어댑터 는 Spring Boot의 자동 구성 을 활용하므로 프로젝트에 Keycloak Spring Boot 스타터를 추가하기 만하면됩니다.

의존성 XML 요소 내에서 Spring Boot로 Keycloak을 실행하려면 다음이 필요합니다.

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>

의존성 XML 요소 다음에 Keycloak에 대한 dependencyManagement 를 지정해야합니다 .

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

다음 임베디드 컨테이너가 현재 지원되며 Spring Boot Keycloak Starter를 사용하는 경우 추가 의존성이 필요하지 않습니다.

  • 수코양이
  • Undertow

5.2. Thymeleaf 웹 페이지

우리는 웹 페이지에 Thymeleaf를 사용하고 있습니다.

세 페이지가 있습니다.

  • external.html – 대중을위한 외부 웹 페이지
  • customers.htmluser 역할을 가진 인증 된 사용자로만 액세스가 제한되는 내부 페이지입니다 .
  • layout.html – 외부를 향하는 페이지와 내부를 향하는 페이지 모두에 사용되는 두 개의 조각으로 구성된 간단한 레이아웃

Thymeleaf 템플릿의 코드는 Github에서 사용할 수 있습니다 .

5.3. 제어 장치

웹 컨트롤러는 내부 및 외부 URL을 적절한 Thymeleaf 템플릿에 매핑합니다.

@GetMapping(path = "/")
public String index() {
    return "external";
}
    
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    model.addAttribute("username", principal.getName());
    return "customers";
}

/ customers 경로의 경우 저장소에서 모든 고객을 검색하고 그 결과를 모델에 속성으로 추가합니다 . 나중에 Thymeleaf에서 결과를 반복합니다.

사용자 이름을 표시 할 수 있도록 주체삽입합니다 .

여기서는 고객을 표시 할 원시 데이터로 사용하고 더 이상 사용하지 않습니다.

5.4. Keycloak 구성

다음 은 기본 필수 구성입니다 .

keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true

기억 하겠지만, 우리는 포트 8180 에서 Keycloak을 시작했고 , 따라서 경로는 keycloak.auth-server-url에 지정되었습니다 . Keycloak 관리 콘솔에서 생성 한 영역 이름을 입력합니다.

keycloak.resource 에서 지정한 값 은 관리 콘솔에서 이름을 지정한 클라이언트와 일치합니다.

우리가 사용할 Security 제약은 다음과 같습니다.

keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

이러한 제약에 대한 모든 요청 보장 / 고객 / *가 그것을 요청하는 사람이 역할에 인증 된 사용자 인 경우에만 권한이 부여됩니다 사용자가 .

또한 컨트롤러의 프린시 펄 을 적절한 사용자 로 채우기 위해 keycloak.principal-attributepreferred_username 으로 정의 할 수 있습니다 .

keycloak.principal-attribute=preferred_username

5.5. 데모

이제 애플리케이션을 테스트 할 준비가되었습니다. Spring Boot 애플리케이션을 실행하려면 Spring Tool Suite (STS)와 같은 IDE를 통해 쉽게 시작하거나 터미널에서 다음 명령을 실행할 수 있습니다.

mvn clean spring-boot:run

방문에 HTTP를 : // localhost를 : 8081 우리는 다음을 참조하십시오

이제 고객클릭 하여 민감한 정보의 위치 인 인트라넷으로 들어갑니다.

이 콘텐츠를 볼 수있는 권한이 있는지 확인하기 위해 Keycloak을 통해 인증하도록 리디렉션되었음을 알 수 있습니다.

user1 로 로그인하면 Keycloak은 권한을 확인하고 사용자 역할 이 있는지 확인하고 제한된 고객 페이지 로 리디렉션됩니다 .

이제 Spring Boot를 Keycloak과 연결하고 작동 방식을 시연하는 설정을 완료했습니다.

보시다시피 Keycloak Authorization Server를 호출하는 전체 프로세스는 Spring Boot 에서 원활하게 처리되었습니다 . Access Token을 직접 생성하기 위해 Keycloak API를 호출하거나 보호 된 리소스에 대한 요청에서 명시 적으로 Authorization 헤더를 보낼 필요가 없습니다.

다음으로 기존 애플리케이션과 함께 Spring Security를 ​​사용하는 방법을 검토 할 것입니다.

6. Spring Security

Keycloak Spring Security Adapter가 있으며 이미 Spring Boot Keycloak Starter 의존성에 포함되어 있습니다. 이제 Spring Security와 Keycloak을 통합하는 방법을 살펴 보겠습니다.

6.1. 의존

Spring Boot와 함께 Spring Security를 ​​사용하려면 다음 의존성을 추가해야합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

최신 Spring Boot Starter Security 릴리스는 Maven Central 에서 찾을 수 있습니다 .

6.2. 구성 클래스

Keycloak는 제공 KeycloakWebSecurityConfigurerAdapter 만들기위한 편리한 기본 클래스로 WebSecurityConfigurer의 인스턴스를.

이는 Spring Security로 보호되는 모든 애플리케이션에 WebSecurityConfigurerAdapter 를 확장하는 구성 클래스가 필요하기 때문에 유용합니다 .

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(
      AuthenticationManagerBuilder auth) throws Exception {
 
        KeycloakAuthenticationProvider keycloakAuthenticationProvider
          = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
          new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
          new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
          .antMatchers("/customers*")
          .hasRole("user")
          .anyRequest()
          .permitAll();
    }
}

위 코드에서 configureGlobal () 메소드 는 역할에 ROLE_ 접두사가 붙지 않도록 SimpleAuthorityMapper작업합니다 .

또 다른 방법 인 keycloakConfigResolver 는 기본 keycloak.json 대신 Spring Boot 속성 파일 지원을 사용하도록 정의합니다 .

Spring Security로 Security 제약을 설정했기 때문에, 우리가 속성 파일에 이전에 배치 한 Security 제약을 제거하거나 어노테이션을 달 수 있습니다.

#keycloak.security-constraints[0].authRoles[0]=user
#keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

이제 인증 후 이전에 보았던 것처럼 내부 고객 페이지에 액세스 할 수 있습니다.

7. 결론

이 예제에서는 Keycloak 서버를 구성하고이를 Spring Boot 애플리케이션과 함께 사용했습니다.

또한 Spring Security를 ​​설정하고 Keycloak과 함께 사용하는 방법도 살펴 보았습니다. 이 기사에 표시된 코드의 작동 버전은 Github에서 사용할 수 있습니다 .