Keycloak создать роль пользователя

Я вставил в keycloak и нового пользователя, и роль. Но как я могу связать сущность пользователя и роли, например, роль пользователя?

Keycloak kc = KeycloakBuilder.builder()
                .serverUrl("http://localhost:8080/auth")
                .realm("master")
                .username("admin")
                .password("admin")
                .clientId("admin-cli")
                .resteasyClient(
                    new ResteasyClientBuilder()
                        .connectionPoolSize(10).build()
                ).build();
//creating role
RoleRepresentation roleRepresentation = new RoleRepresentation();
        roleRepresentation.setName("latest_role");
        kc.realm("master").roles().create(roleRepresentation);
//creating user
UserRepresentation user = new UserRepresentation();
        user.setUsername("anoop");
        user.setFirstName("anoop");
        user.setLastName("anoop");
        user.setEnabled(true);
        user.setCredentials(Arrays.asList(credential));
        kc.realm("master").users().create(user);

person boycod3    schedule 27.03.2017    source источник


Ответы (2)


Кажется, это нетривиальная проблема. Обычно я ожидал бы эту функциональность в user.setRealmRoles(roleRepresentation) как в этом примере. Но у меня это не сработало.

Вместо этого я использовал эту функцию, чтобы добавить 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);
}

РЕДАКТИРОВАТЬ:

Похоже, что учетные данные не сохраняются для пользователя. Чтобы заставить keycloak сохранить их, вам необходимо сбросить пароль с помощью:

UserResource userResource = kc.realm("Test").users().get(userId);
userResource.resetPassword(credential);
person David Klassen    schedule 28.03.2017
comment
После того, как я создал пользовательский keycloak, я не смогу войти в систему. показывает неверное имя пользователя / пароль. - person boycod3; 04.04.2017

UserRepresentation user = new UserRepresentation();
    user.setEmail("[email protected]");
    user.setUsername("naveenm555");
    user.setFirstName("naveen");
    user.setLastName("m");
    user.setEnabled(true);
    Response response = kc.realm("appscook").users().create(user);
    System.out.println("user created.... verify in keycloak!");
    String userId = getCreatedId(response);

    UserResource userResource=kc.realm("appscook").users().get(userId);
    CredentialRepresentation newCredential = new CredentialRepresentation();
    newCredential.setType(CredentialRepresentation.PASSWORD);
    newCredential.setValue("naveenm555");
    newCredential.setTemporary(false);
    userResource.resetPassword(newCredential);
    System.out.println("role created.");

Этот код создаст нового пользователя и установит ему роль. и это позволит пользователю войти в систему. Приведенный выше код не позволит пользователю войти в систему после создания.

person boycod3    schedule 04.04.2017
comment
Привет @ boycod3, где вы создаете роль и назначаете ее пользователю, я не вижу этого нигде в вашем коде. - person Satya Ram; 30.11.2019