Keycloakは、いくつかの簡単な手順でSpringBootアプリケーションの権限制御を実装します

前回の記事で最初にkeycloakを試し、felord.cnという名前のレルムを手動で作成し、レルムの下にfelordという名前のユーザーを作成しました今日、対応するSpring Boot Adapterを試して、keycloakSpringBootアプリケーションをどのように保護するかを見てみましょう

 Code Farmer Xiaopangをフォローしてスターを付け、関連する乾物の記事をできるだけ早く入手してください。

クライアント

多くの学生がWeChatOpenPlatformとAntOpenPlatformを使用していると思います。まず、これらのオープンプラットフォームにクライアントを登録して、ユーザー名やパスワードなどの一連の資格情報を取得する必要があります。appidとsecretと呼ばれるものもあれば、clientidとsecretと呼ばれるものもあり、どちらも同じ意味です。実際、keycloakも同様であり、クライアントは対応するレルムに登録する必要があります。次の図は、 keycloak内のマスターレルムとカスタムレルムの関係を明確に示しているだけでなく、レルム内のユーザーとクライアント間の関係も示しています。

レルム、クライアント、ユーザー関係図

felord.cnの領域にクライアントを作成する必要があります。

レルムでクライアントを作成する

作成後、felord.cnのクライアントがもう1つあることがわかります。

レルムクライアントリスト

作成したユーザーは、http:// localhost:8011 / auth / realms / felord.cn /account/からログインできます。

次に、クライアントのspring-boot-clientを編集して構成します。

リダイレクトURLを入力します

テストのために、ここでは、URIを効果的にリダイレクトするために、[設定]タブに必要な項目のみを入力しました。これは、クライアントのspringboot-clientのすべてのAPIがアクセス許可によって制御されることを意味します。

役割

ロールベースのパーミッションコントロールは現在の主流のパーミッションコントロールのアイデアであり、keycloakもこのアプローチを採用しています。ロールを作成し、前の記事で作成したユーザーfelordを付与する必要があります。簡単な役割を作成しましょう:

keycloakでロールを作成する

キークロークの役割は非常に強力です。次の一連の記事では、ファットブラザーがこの概念を深く学びます。

ロールはユーザーにマップされます

次に、上記で作成したロールbase_userをユーザーfelordに割り当てます。

レルム内のユーザーに役割を割り当てます

この時点で、ユーザー、ロール、およびロールのマッピングがすべて完了し、残っているのはクライアントでリソースを定義することだけです。

JWTを取得して更新する

次の方法で、ユーザーがJWTペアをログインさせることができます。

POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1
Host: localhost:8011
Content-Type: application/x-www-form-urlencoded

client_id=springboot-client&username=felord&password=123456&grant_type=password

取得します:

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiS 省略",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAi 省略",
    "token_type": "Bearer",
    "not-before-policy": 0,
    "session_state": "2fc7e289-c86f-4f6f-b4d3-1183a9518acc",
    "scope": "profile email"
}

トークンを更新するには、refresh_tokenを持ってきて、grant_typeをrefresh_tokenに変更して、トークンを更新するだけです。更新を要求するメッセージは次のとおりです。

POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1
Host: localhost:8011
Content-Type: application/x-www-form-urlencoded

client_id=springboot-client&grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlYWE2MThhMC05Y2UzLTQxZWMtOTZjYy04MGQ5ODVkZjJjMTIifQ.eyJleHAiOjE2MjU3NjI4ODYsImlhdCI6MTYyNTc2MTA4NiwianRpIjoiZjc2MjVmZmEtZWU3YS00MjZmLWIwYmQtOTM3MmZiM2Q4NDA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDExL2F1dGgvcmVhbG1zL2ZlbG9yZC5jbiIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxMS9hdXRoL3JlYWxtcy9mZWxvcmQuY24iLCJzdWIiOiI0YzFmNWRiNS04MjU0LTQ4ZDMtYTRkYS0wY2FhZTMyOTk0OTAiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoic3ByaW5nYm9vdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZDU2NmU0ODMtYzc5MS00OTliLTg2M2ItODczY2YyNjMwYWFmIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.P4vWwyfGubSt182P-vcyMdKvJfvwKYr1nUlOYBWzQks

注:両方のリクエストのコンテンツタイプはapplication/x-www-form-urlencodedです。

SpringBootクライアント

非常に伝統的なSpringBootアプリケーションを構築し、 Spring MVCモジュールを忘れずに持ってきてからkeycloakスターターを追加してください。

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

現在のkeycloakのバージョンは14.0.0です。

次に、SpringMVCインターフェイスを何気なく記述します。

/**
 * @author felord.cn
 * @since 2021/7/7 17:05
 */
@RestController
@RequestMapping("/foo")
public class FooController {

    @GetMapping("/bar")
    public String bar(){
        return "felord.cn";
    }

}

次に、felord.cnレルムでbase_userロールを持つユーザーのみが/ foo/barインターフェースにアクセスできることを宣言および定義します。では、定義はどこにありますか?まず、Spring Bootのapplication.ymlで静的に定義し、後で動的制御を実装します。構成は次のとおりです。

keycloak:
# 声明客户端所在的realm
  realm: felord.cn
# keycloak授权服务器的地址
  auth-server-url: http://localhost:8011/auth
# 客户端名称
  resource: springboot-client
# 声明这是一个公开的客户端,否则不能在keycloak外部环境使用,会403
  public-client: true
# 这里就是配置客户端的安全约束,就是那些角色映射那些资源
  security-constraints:
# 角色和资源的映射关系。下面是多对多的配置方式 ,这里只配置base_user才能访问 /foo/bar
    - auth-roles:
        - base_user
      security-collections:
        - patterns:
            - '/foo/bar'

次に、Spring Bootアプリケーションを起動し、ブラウザーでhttp:// localhost:8080 / foo / barを呼び出すと、ブラウザーが次のアドレスにジャンプすることがわかります。

http://localhost:8011/auth/realms/felord.cn/protocol/openid-connect/auth?response_type=code&client_id=springboot-client&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Ffoo%2Fbar&state=20e0958d-a7a9-422a-881f-cbd8f25d7842&login=true&scope=openid

OIDC認証認証ログイン

これは、 OIDC(OAuth 2.0の拡張バージョン)の認証および承認モードに基づいています。ユーザー名とパスワードを正しく入力した場合にのみ、/ foo/barから正しい応答を取得できます。

要約する

注意:これは一連の記事です。既存の章を表示するには、記事の冒頭にある#keycloakをクリックしてください。

OIDC認証と承認を実装し、Spring Bootのインターフェイスを一部の構成のみで保護しました。これは、非常に簡単です。ただし、この記事を読んだ後は、OIDCプロトコルについてあまり詳しくないため、多くの質問があります。このプロトコルは非常に重要であり、主要なメーカーがこのプロトコルを使用しています。次の記事では、この契約の補足レッスンを提供します。

おすすめ

転載: blog.csdn.net/m0_63437643/article/details/123794272