Keycloak 11.0 新機能小ネタ REST API編

## きっかけ
- Keycloakのメジャーバージョンが出るたびに何か記事を書いていたことに気づいたので何か書いてみることにしました。
- 今回はKeycloak 11.0 で追加された [REST API(GET Users) の enabled と exact パラメータ](https://www.keycloak.org/docs-api/11.0/rest-api/index.html#_getusers)について書きます。
  - 両方とも利用頻度の高そうで、便利そうだったので試してみました。 

## Jira
-  exact パラメータ
  - [Allow exact user search by user attributes](https://issues.redhat.com/browse/KEYCLOAK-2343)
- enabled パラメータ
  - [Add filtering for GET /users endpoint for enabled/disabled users](https://issues.redhat.com/browse/KEYCLOAK-14282)

## exact パラメータについて
- GET /{realm}/users?username=demo&exact=true
- usernameを完全一致で検索できるようになります。
- [usernameパラメータと一緒でしか検索時に利用することができません。](https://github.com/pedroigor/keycloak/blob/4738c15e2670efc805602d67631eff9d7a235229/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/UsersResource.java#L61)
- ` exact=true ` にすると以下のようなSQLが実行されます。 DBはmariadbを利用しています。
  - 見ての通り WHERE 句に ` = ` が利用されるのでパフォーマンスにプラスに働きそうではあります。

```sql
SELECT userentity0_.id                          AS ID1_73_, 
       userentity0_.created_timestamp           AS CREATED_2_73_, 
       userentity0_.email                       AS EMAIL3_73_, 
       userentity0_.email_constraint            AS EMAIL_CO4_73_, 
       userentity0_.email_verified              AS EMAIL_VE5_73_, 
       userentity0_.enabled                     AS ENABLED6_73_, 
       userentity0_.federation_link             AS FEDERATI7_73_, 
       userentity0_.first_name                  AS FIRST_NA8_73_, 
       userentity0_.last_name                   AS LAST_NAM9_73_, 
       userentity0_.not_before                  AS NOT_BEF10_73_, 
       userentity0_.realm_id                    AS REALM_I11_73_, 
       userentity0_.service_account_client_link AS SERVICE12_73_, 
       userentity0_.username                    AS USERNAM13_73_ 
FROM   user_entity userentity0_ 
WHERE  userentity0_.realm_id = 'master' 
       AND Lower(userentity0_.username) = 'demo' 
ORDER  BY userentity0_.username ASC 
LIMIT  100 
```

- ちなみに ` exact=false ` にすると以下のようなSQLが実行されます。
  - 見ての通り WHERE 句に ` LIKE ` が利用されています。

```sql
SELECT userentity0_.id                          AS ID1_73_, 
       userentity0_.created_timestamp           AS CREATED_2_73_, 
       userentity0_.email                       AS EMAIL3_73_, 
       userentity0_.email_constraint            AS EMAIL_CO4_73_, 
       userentity0_.email_verified              AS EMAIL_VE5_73_, 
       userentity0_.enabled                     AS ENABLED6_73_, 
       userentity0_.federation_link             AS FEDERATI7_73_, 
       userentity0_.first_name                  AS FIRST_NA8_73_, 
       userentity0_.last_name                   AS LAST_NAM9_73_, 
       userentity0_.not_before                  AS NOT_BEF10_73_, 
       userentity0_.realm_id                    AS REALM_I11_73_, 
       userentity0_.service_account_client_link AS SERVICE12_73_, 
       userentity0_.username                    AS USERNAM13_73_ 
FROM   user_entity userentity0_ 
WHERE  userentity0_.realm_id = 'master' 
       AND ( Lower(userentity0_.username) LIKE '%demo%' ) 
ORDER  BY userentity0_.username ASC 
LIMIT  100 
```

## enabled パラメータについて
- GET /{realm}/users?enabled=true
- ユーザの有効/無効をフィルタリングの条件に設定することができます。
- [11.0を利用して手元にあるh2、postgresql、mariadbで試してみましたが、h2でのみ enabled パラメータが正常に動作しました。](https://issues.redhat.com/browse/KEYCLOAK-15089)
  - 詳細についてはリンクのJIRAに記載しています。

## 感想
- enabled パラメータで動作確認をしているときに、修正のPRを出してOSSにコントリビュートできるようになれたらいいなと思いました。
- [ただ、今回は先に別機能のPRで修正をされている方がいました。](https://github.com/keycloak/keycloak/pull/7319/files#diff-e888abf22d16a3fbb48d4150c4dad63fR896)
- 今後も新機能などの調査をしていこう。。。