1概要

この記事では、Keycloakサーバーの設定の基本、Spring Bootアプリケーションをそれに接続する方法、そしてSpring Securityでそれを使用する方法について説明します。


2 Keycloakとは何ですか?

Keycloakは、現代のアプリケーションおよびサービスを対象とした、オープンソースのIDおよびアクセス管理ソリューションです。

Keycloakは、シングルサインオン(SSO)、IDブローカリングおよびソーシャルログイン、ユーザーフェデレーション、クライアントアダプタ、管理コンソール、アカウント管理コンソールなどの機能を提供します。 Keycloakの詳細については、http://www.keycloak.org/[official page]を参照してください。

このチュートリアルでは、Keycloakのアドミンコンソールを使用してセットアップしてから、Keycloakクライアントアダプタを使用してSpring Bootに接続します。


3 Keycloakサーバーの設定


3.1. Keycloak

のダウンロードとインストール

選択できる配布がいくつかあります。

ただし、このチュートリアルでは、スタンドアロンバージョンを使用します。

公式ソースからhttp://www.keycloak.org/downloads.html[Keycloak-3.3.0.Final Standalone server distribution]をダウンロードしてください。

スタンドアロンサーバーディストリビューションをダウンロードしたら、ターミナルからKeycloakを解凍して起動できます。

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


./standalone.sh

を実行した後、Keycloakはサービスを開始します。


Keycloak 3.3.0.Final(WildFly Core 3.0.1.Final)

を含む行が始まったら、その起動が完了したことがわかります。

リンク:/uploads/createKeycloakAdmin-768×484.png%20768w[]

パスワード「

zaq1!QAZ

」を持つ「

initial1

」という名前のユーザーを作成しましょう。



Keycloakへようこそ」

が表示されます。

リンク:/uploads/welcomeKeycloak-768×521.png%20768w[]

これで管理コンソールに進むことができます。


3.2. レルムの作成

マウスを左上隅にナビゲートして、[Create a Realm]__ボタンを見つけます。

リンク:/uploads/addRealmKeycloak-1024×524.png%201024w[]

それを「

SpringBootKeycloak

」と命名しています。


3.3. クライアントを作成する

それでは、クライアントページに移動します。下の画像からわかるように、

Keycloakには

が既に組み込まれているクライアントが付属しています。

しかし、アプリケーションにクライアントを追加する必要があるので、[作成]をクリックします。

新しいクライアントを「

login-app

」と呼びます。

リンク:/uploads/addClientKeycloak-e1510070784356-768×335.png%20768w[]

このチュートリアルの次の画面では、「有効なリダイレクトURI」フィールド以外のすべてのデフォルトをそのまま残します。ポート

8081

にリダイレクトされます。

リンク:/uploads/validRedirectURI-768×382.png%20768w[]


3.4. ロールとユーザーを作成する

  • Keycloakはロールベースアクセスを使用します。したがって、各ユーザーには役割が必要です。

「ロール」ページに移動する必要があります。

次に、 ”

user

“ロールを追加します。

リンク:/uploads/addRoleKeycloak-e1542274115910-100×38.png%20100w[]

これで、ユーザーに割り当てることができるロールができましたが、まだユーザーはいません。それでは、「ユーザー」ページに移動して、ページを追加しましょう。

リンク:/uploads/usersPageKeycloak-1024×462.png%201024w[]

ユーザー__ “user1″を追加します。

リンク:/uploads/addUserKeycloak-768×546.png%20768w[]

ユーザーが作成されると、このページが表示されます。

リンク:/uploads/userCreatedKeycloak-1024×469.png%201024w[]

これで「認証情報」タブに移動できます。パスワードを「__

[email protected

]」に設定します。

[Role Mappings]タブに移動します。ユーザーロールを割り当てます。

リンク:/uploads/roleMappingKeycloak-e1542274156615-100×35.png%20100w[]

3.5. カスタムログインページの作成

Keycloakは、アクセストークンを生成および更新するためのREST APIを提供します。このAPIを使って自分のログインページを簡単に作成できます。

まず、このURLにPOSTリクエストを送信してKeycloakからアクセストークンを取得する必要があります。

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

リクエストはこのJSONボディを持つべきです:

{
    'client__id': 'your__client__id',
    'username': 'your__username',
    'password': 'your__password',
    'grant__type': 'password'
}

それに応じて、

access

token



refresh

token

が返されます。

アクセストークンは、それを

Authorization

ヘッダーに配置するだけで、Keycloakで保護されたリソースへのすべての要求で使用されます。

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

アクセストークンが期限切れになると、POSTリクエストを上記と同じURLに送信することで更新できますが、ユーザー名とパスワードの代わりに更新トークンが含まれます。

{
    'client__id': 'your__client__id',
    'refresh__token': refresh__token__from__previous__request,
    'grant__type': 'refresh__token'
}

これは新しい

access

token



refresh__tokenで応答します。


4 Spring Bootアプリケーションの作成


4.1. 依存関係

最新のSpring Boot Keycloak Starter依存関係はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22keycloak-spring-boot-starter%22[Maven Central]で見つけることができます。

  • Keycloak Spring Bootアダプタ


    はSpring Bootの自動設定** を利用しています。そのため、必要なのはKeycloak Spring Bootスターターをプロジェクトに追加することだけです。

dependency XML要素内で、Spring BootでKeycloakを実行するには、次のものが必要です。

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

dependencies XML要素の後に、Keycloakに

dependencyManagement

を指定する必要があります。

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

次の埋め込みコンテナは現在サポートされており、Spring Boot Keycloak Starterを使用する場合は追加の依存関係は必要ありません。

  • Tomcat

  • Undertow

  • 桟橋


4.2. ThymeleafのWebページ

私たちはウェブページにThymeleafを使っています。

3ページあります。


  • external.html –

    一般向けの外部向けWebページ


  • customers.html

    – アクセスできる内部向きのページ

ロール “user”を持つ認証済みユーザーのみに制限されます。
**

layout.html

– 2つのフラグメントからなる単純なレイアウト

外向きページと内向きページの両方に使用

Thymeleafテンプレートのコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-keycloak/src/main/resources/templates[Githubで入手可能]です。


4.3. コントローラ

Webコントローラは、内部および外部のURLを適切なThymeleafテンプレートにマッピングします。

@GetMapping(path = "/")
public String index() {
    return "external";
}

@GetMapping(path = "/customers")
public String customers(Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    return "customers";
}

パス

/customers

については、リポジトリからすべての顧客を取得し、その結果を

Model

の属性として追加します。後で、Thymeleafの結果を繰り返します。


4.4. キーロックの設定

これが基本的な必須の設定です。

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

で指定した値は、管理コンソールで指定したクライアントと一致します。

これが私たちが使用するセキュリティ上の制約です

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

上記のセキュリティ上の制約により、

/customers/**

へのすべての要求は、それを要求しているユーザーがロール “user”を持つ認証済みユーザーである場合にのみ承認されます。


4.5. デモンストレーション

これで、アプリケーションをテストする準備が整いました。 Spring Bootアプリケーションを実行するには、Spring Tool Suite(STS)のようなIDEを通してそれを簡単に起動するか、またはターミナルでこのコマンドを実行します。

mvn clean spring-boot:run


localhost:8080:

にアクセス

今度は「

顧客

」をクリックしてイントラネットを入力します。これは機密情報の場所です。

このコンテンツを閲覧する権限があるかどうかを確認するために、Keycloakを通じて認証するようにリダイレクトされていることがわかります。

認証が行われ、承認がKeycloakによって確認されると、制限のあるお客様のページにリダイレクトされます。

これで、Spring BootとKeycloakを接続し、それがどのように機能するかを実証するセットアップは完了しました。

今度は、既存のアプリケーションと組み合わせてSpring Securityを使用する方法を検討します。


5春のセキュリティ

Keycloak Spring Security Adapterがあり、それは

既にSpring Boot Keycloak Starter依存関係

に含まれています。 Spring SecurityとKeycloakを統合する方法について説明します。


5.1. 依存

Spring SecurityとSpring Bootを併用するには、この依存関係を追加する必要があります。

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

最新のSpring Boot Starter Securityリリースはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-bootにあります。 -starter-security%22[Maven Central上]。


5.2. 構成クラス

Keycloakは、http://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/config/annotation/web/WebSecurityConfigurerを作成するための便利な基本クラスとして

KeycloakWebSecurityConfigurerAdapter

を提供しています。 html[

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

    :

    SimpleAuthorityMapper

    を確実にするためのタスク

役割の先頭には

ROLE


が付いていません
**

keycloakConfigResolver__:これはSpringを使いたいことを定義します。

デフォルトの

keycloak.json

ではなくブートプロパティファイルのサポート

5.3.

application.properties

Spring Securityでセキュリティ制限を設定したので、

application.properties

に配置した以前のセキュリティ制限を削除できます。

これを

application.properties

に追加します。

keycloak.principal-attribute=preferred__username


5.4. コントローラ

ユーザーのユーザー名を利用するために、

Principal

を挿入するようにコントローラを更新しています。

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


5.5. タイムリーフ

divコンテナの下に、ユーザーに挨拶するための1行を追加します。

<h1>Hello, <span th:text="${username}">--name--</span>.</h1>


5.6. デモ

認証して社内の顧客のページにアクセスすると、次のようになります。


6結論

このチュートリアルでは、Keycloakサーバーを構成し、それをSpring Bootアプリケーションで使用しました。

また、Spring Securityを設定してKeycloakと組み合わせて使用​​する方法も説明しました。この記事に示されているコードの実用的なバージョンはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-keycloak[Githubで入手可能]です。