前回の記事で最初にkeycloakを試し、felord.cnという名前のレルムを手動で作成し、レルムの下にfelordという名前のユーザーを作成しました。今日、対応するSpring Boot Adapterを試して、keycloakがSpringBootアプリケーションをどのように保護するかを見てみましょう。
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プロトコルについてあまり詳しくないため、多くの質問があります。このプロトコルは非常に重要であり、主要なメーカーがこのプロトコルを使用しています。次の記事では、この契約の補足レッスンを提供します。