Skip to content

Commit 04af14e

Browse files
authored
Merge pull request #64 from fschmtt/keycloak-21
Support Keycloak 21.0.0
2 parents e6d28bb + aa51547 commit 04af14e

File tree

6 files changed

+17
-22
lines changed

6 files changed

+17
-22
lines changed

.github/workflows/php-integration.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212

1313
strategy:
1414
matrix:
15-
keycloak: [17.0.0, 18.0.0, 19.0.0, 20.0.0]
15+
keycloak: [17.0.0, 18.0.0, 19.0.0, 20.0.0, 21.0.0]
1616

1717
env:
1818
KEYCLOAK_VERSION: ${{ matrix.keycloak }}

README.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
![PHP Legacy (Keycloak compatibility)](https://github.com/fschmtt/keycloak-rest-api-client-php/actions/workflows/php-integration-legacy.yml/badge.svg?branch=main)
55

66
# Keycloak Admin REST API Client
7-
PHP client to interact with [Keycloak's Admin REST API](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html).
7+
PHP client to interact with [Keycloak's Admin REST API](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html).
88

99
Inspired by [keycloak/keycloak-nodejs-admin-client](https://github.com/keycloak/keycloak-nodejs-admin-client).
1010

@@ -42,28 +42,28 @@ echo sprintf(
4242
```
4343
will print e.g.
4444
```text
45-
Keycloak 20.0.0 is running on Linux/5.10.25-linuxkit (amd64) with OpenJDK 64-Bit Server VM/11.0.11 since 0 days, 2 hours, 37 minutes, 7 seconds and is currently using 139 MB of 512 MB (28 %) memory.
45+
Keycloak 21.0.0 is running on Linux/5.10.25-linuxkit (amd64) with OpenJDK 64-Bit Server VM/11.0.11 since 0 days, 2 hours, 37 minutes, 7 seconds and is currently using 139 MB of 512 MB (28 %) memory.
4646
```
4747

4848
More examples can be found in the [examples](examples) directory.
4949

5050
## Available Resources
51-
### [Attack Detection](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_attack_detection_resource)
51+
### [Attack Detection](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_attack_detection_resource)
5252
| Endpoint | Response | API |
5353
|----------|----------|-----|
5454
| `DELETE /admin/realms/{realm}/attack-detection/brute-force/users` | `n/a` | [AttackDetection::clear()](src/Resource/AttackDetection.php) |
5555
| `GET /admin/realms/{realm}/attack-detection/brute-force/users/{userId}` | [Map](src/Type/Map.php) | [AttackDetection::userStatus()](src/Resource/AttackDetection.php) |
5656
| `DELETE /admin/realms/{realm}/attack-detection/brute-force/users/{userId}` | `n/a` | [AttackDetection::clearUser()](src/Resource/AttackDetection.php) |
5757

58-
### [Clients](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_clients_resource)
58+
### [Clients](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_clients_resource)
5959
| Endpoint | Response | API |
6060
|----------|----------|-----|
6161
| `GET /admin/realms/{realm}/clients` | [ClientCollection](src/Collection/ClientCollection.php) | [Clients::all()](src/Resource/Clients.php) |
6262
| `GET /admin/realms/{realm}/clients/{id}` | [Client](src/Representation/Client.php) | [Clients::get()](src/Resource/Clients.php) |
6363
| `PUT /admin/realms/{realm}/clients/{id}` | [Client](src/Representation/Client.php) | [Clients::update()](src/Resource/Clients.php) |
6464
| `POST /admin/realms/{realm}/clients` | [Client](src/Representation/Client.php) | [Clients::import()](src/Resource/Clients.php) |
6565

66-
### [Groups](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_clients_resource)
66+
### [Groups](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_clients_resource)
6767
| Endpoint | Response | API |
6868
|----------|----------|-----|
6969
| `GET /admin/realms/{realm}/groups` | [ClientCollection](src/Collection/GroupCollection.php) | [Groups::all()](src/Resource/Groups.php) |
@@ -72,7 +72,7 @@ More examples can be found in the [examples](examples) directory.
7272
| `POST /admin/realms/{realm}/groups` | `n/a` | [Groups::import()](src/Resource/Groups.php) |
7373
| `DELETE /admin/realms/{realm}/groups` | `n/a` | [Groups::delete()](src/Resource/Groups.php) |
7474

75-
### [Realms Admin](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_realms_admin_resource)
75+
### [Realms Admin](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_realms_admin_resource)
7676
| Endpoint | Response | API |
7777
|----------|----------|-----|
7878
| `POST /admin/realms` | [Realm](src/Representation/Realm.php) | [Realms::import()](src/Resource/Realms.php) |
@@ -85,7 +85,7 @@ More examples can be found in the [examples](examples) directory.
8585
| `POST /admin/realms/{realm}/clear-realm-cache` | `n/a` | [Realms::clearRealmCache()](src/Resource/Realms.php) |
8686
| `POST /admin/realms/{realm}/clear-user-cache` | `n/a` | [Realms::clearUserCache()](src/Resource/Realms.php) |
8787

88-
### [Users](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_users_resource)
88+
### [Users](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_users_resource)
8989
| Endpoint | Response | API |
9090
|----------|----------|-----|
9191
| `GET /admin/realms/{realm}/users` | [UserCollection](src/Collection/UserCollection.php) | [Users::all()](src/Resource/Users.php) |
@@ -102,15 +102,15 @@ More examples can be found in the [examples](examples) directory.
102102
| `POST /{realm}/users/{id}/role-mappings/realm` | `n/a` | [Users::addRealmRoles()](src/Resource/Users.php) |
103103
| `DELETE /{realm}/users/{id}/role-mappings/realm` | `n/a` | [Users::removeRealmRoles()](src/Resource/Users.php) |
104104

105-
### [Roles](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_roles_resource)
105+
### [Roles](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_roles_resource)
106106
| Endpoint | Response | API |
107107
|----------|----------|-----|
108108
| `GET /admin/realms/{realm}/roles` | [RoleCollection](src/Collection/RoleCollection.php) | [Roles::all()](src/Resource/Roles.php) |
109109
| `GET /admin/realms/{realm}/roles/{roleName}` | [Role](src/Representation/Role.php) | [Roles::get()](src/Resource/Roles.php) |
110110
| `POST /admin/realms/{realm}/roles` | `n/a` | [Roles::create()](src/Resource/Roles.php) |
111111
| `DELETE /admin/realms/{realm}/roles/{roleName}` | `n/a` | [Roles::delete()](src/Resource/Roles.php) |
112112

113-
### [Root](https://www.keycloak.org/docs-api/20.0.0/rest-api/index.html#_root_resource)
113+
### [Root](https://www.keycloak.org/docs-api/21.0.0/rest-api/index.html#_root_resource)
114114
| Endpoint | Response | API |
115115
|----------|----------|-----|
116116
| `GET /admin/serverinfo` | [ServerInfo](src/Representation/ServerInfo.php) | [ServerInfo::get()](src/Resource/ServerInfo.php) |

docker-compose.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ services:
1010
working_dir: /app
1111

1212
keycloak:
13-
image: quay.io/keycloak/keycloak:20.0.0
13+
image: quay.io/keycloak/keycloak:21.0.0
1414
command: start-dev
1515
environment:
1616
KEYCLOAK_ADMIN: admin

docker/keycloak/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
ARG KEYCLOAK_VERSION=20.0.0
1+
ARG KEYCLOAK_VERSION=21.0.0
22
FROM quay.io/keycloak/keycloak:${KEYCLOAK_VERSION}
33

44
ENTRYPOINT [ "/opt/keycloak/bin/kc.sh", "start-dev" ]

tests/Integration/Resource/UsersTest.php

+4-10
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ public function testImportSearchUpdateDeleteUser(): void
4040
);
4141

4242
// Search (imported) user
43-
$importedUser = $resource->search('master', new Criteria([
44-
'username' => $importedUsername,
45-
'exact' => true,
46-
]))->first();
43+
$importedUser = $this->searchUserByUsername($importedUsername);
4744
static::assertInstanceOf(User::class, $importedUser);
4845
static::assertEquals($importedFirstName, $importedUser->getFirstName());
4946

@@ -54,10 +51,7 @@ public function testImportSearchUpdateDeleteUser(): void
5451
// Update (imported) user
5552
$resource->update('master', $importedUser->getId(), $importedUser->withFirstName($updatedFirstName));
5653

57-
$updatedUser = $resource->search('master', new Criteria([
58-
'username' => $importedUsername,
59-
'exact' => true,
60-
]))->first();
54+
$updatedUser = $this->searchUserByUsername($importedUsername);
6155
static::assertInstanceOf(User::class, $updatedUser);
6256
static::assertSame($updatedFirstName, $updatedUser->getFirstName());
6357

@@ -173,10 +167,10 @@ public function testCreateUserWithPasswordCredential(): void
173167
static::assertNull($user);
174168
}
175169

176-
private function searchUserByUsername(string $username): ?User
170+
private function searchUserByUsername(string $username, string $realm = 'master'): ?User
177171
{
178172
/** @var User|null $user */
179-
$user = $this->getKeycloak()->users()->search('master', new Criteria([
173+
$user = $this->getKeycloak()->users()->search($realm, new Criteria([
180174
'username' => $username,
181175
'exact' => true,
182176
]))->first();

tests/Unit/Http/PropertyFilterTest.php

+1
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,6 @@ public function keycloakVersions(): Generator
100100
yield ['18.0.0'];
101101
yield ['19.0.0'];
102102
yield ['20.0.0'];
103+
yield ['21.0.0'];
103104
}
104105
}

0 commit comments

Comments
 (0)