これは些細な問題ではないようです。通常、私はこの機能がthis exampleのようにuser.setRealmRoles(roleRepresentation)
にあると考えています。しかし、それは私のために働いていませんでした。
代わりに、この機能を使用してをuser
に追加しました。
RoleRepresentation savedRoleRepresentation = kc.realm("master").roles()
.get("latest_role").toRepresentation();
kc.realm("master").users().get(userId).roles().realmLevel()
.add(asList(savedRoleRepresentation));
完全なコード:
Keycloak kc = Keycloak.getInstance("http://localhost:8080/auth",
"master", "admin", "admin", "admin-cli");
RoleRepresentation roleRepresentation = new RoleRepresentation();
roleRepresentation.setName("latest_role");
kc.realm("Test").roles().create(roleRepresentation);
UserRepresentation user = new UserRepresentation();
user.setUsername("test");
user.setFirstName("test");
user.setLastName("test");
user.setEnabled(true);
user.setCredentials(Arrays.asList(credential));
Response response = kc.realm("Test").users().create(user);
String userId = getCreatedId(response);
System.out.println("Testuser created.... verify in keycloak!");
RoleRepresentation savedRoleRepresentation = kc.realm("Test").roles()
.get("latest_role").toRepresentation();
kc.realm("Test").users().get(userId).roles().realmLevel()
.add(asList(savedRoleRepresentation));
private String getCreatedId(Response response) {
URI location = response.getLocation();
if (!response.getStatusInfo().equals(Response.Status.CREATED)) {
Response.StatusType statusInfo = response.getStatusInfo();
throw new WebApplicationException("Create method returned status " +
statusInfo.getReasonPhrase() + " (Code: " + statusInfo.getStatusCode() + "); expected status: Created (201)", response);
}
if (location == null) {
return null;
}
String path = location.getPath();
return path.substring(path.lastIndexOf('/') + 1);
}
EDIT:
資格情報は、ユーザー用に保存されていないように思えます。それらを保存するためにkeycloakを強制するには、あなたがパスワードをリセットする必要があります。
UserResource userResource = kc.realm("Test").users().get(userId);
userResource.resetPassword(credential);
ユーザーを作成した後、keycloakはログインできません。無効なユーザー名/パスワードを示しています。 – boycod3