Keycloak - Добавить / Удалить роль Realm от пользователя, используя APIcalls - PullRequest
2 голосов
/ 20 февраля 2020

передача userRepresentation.id в keycloakServerURL + "/ auth / admin / realms / XXXX / users /" + userId + "/ role-mappings / realm" Я получаю эти роли для определенного пользователя ...

[
    {
        "id": "xxxxxxx-1faf-4604-832a-fa7ab7eb4344",
        "name": "uma_authorization",
        "description": "${role_uma_authorization}",
        "composite": false,
        "clientRole": false,
        "containerId": "XXXX"
    },
    {
        "id": "xxxxxxx-ad9f-444e-adf4-be11ab7a3d98",
        "name": "member_paid",
        "description": "Membership Paid",
        "composite": false,
        "clientRole": false,
        "containerId": "XXXX"
    },
    {
        "id": "xxxxx-2d73-48a8-844d-a953cb570270",
        "name": "offline_access",
        "description": "${role_offline-access}",
        "composite": false,
        "clientRole": false,
        "containerId": "XXXX"
    }
]

Я не могу понять, какой API я должен использовать для добавления / удаления роли от / к Пользователю.

Подскажите, пожалуйста, какой API мне нужно использовать

Лучшее, что я могу найти, это ниже, но я не знаю, какими должны быть параметры (свойство Path и request) ...

public void removeRole(JsonObject userToken, String clientId, String role) throws IOException {

    /auth/admin/realms/XXXX/groups/" + role + "/role-mappings/clients/" + clientId);

    ...
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("POST");

    con.setRequestProperty("id", clientId);
    con.setRequestProperty("name", role);
    ....

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Конечные точки являются

Получить сопоставления ролей:

GET / auth / admin / realms / {Realm} / users / {userid} / role- mappings / realm

Добавить сопоставления ролей:

POST / auth / admin / realms / {Realm} / users / {userid} / сопоставления ролей / realm

Удалить сопоставления ролей:

УДАЛИТЬ / auth / admin / realms / {Realm} / users / {userid} / сопоставления ролей / realm

Пример добавления роли

У вас есть роль, например с именем testrole с идентификатором dc5572a5-b7e0-4c4b-b841-dc88108df70f (вы видите ее в URL-адресе, когда открываете keycloak admin GUI, или вы получаете ее с некоторым другой запрос RestAPI)

Теперь у нас есть запрос типа POST к конечной точке /auth/admin/realms/{Realm}/users/{userid}/role-mappings/realm с телом типа application/json и следующим значением тела

[
    {
        "id": "dc5572a5-b7e0-4c4b-b841-dc88108df70f",
        "name" : "testrole"
    }
]

После При успешном выполнении вы получите ответ с HTTP-кодом 204 => Для этого пользователя применяется testrole - ролевое отображение

Пример запроса Curl

curl --request POST \
  --url http://localhost/auth/admin/realms/{Realm}/users/{userid}/role-mappings/realm \
  --header 'authorization: Bearer eyJh......h3RLw' \
  --header 'content-type: application/json' \
  --data '[
    {
        "id": "dc5572a5-b7e0-4c4b-b841-dc88108df70f",
        "name" : "testrole"
    }
]'

Если вы хотите удалить его снова просто отправьте тот же запрос (Сэм тело), ​​но с HTTP-методом DELETE вместо POST

Пожалуйста, дайте мне знать, если это решило вашу проблему

0 голосов
/ 22 февраля 2020

На основании вышеприведенного сообщения Зла, чтобы помочь мне ...

Использование Java (и JEE 8 для хороших возможностей JSON)

Получить токен (используя клиент, который вы настроили в keycloak с типом доступа конфиденциальный и доступом к нужным ролям (для 9.0.0 это теперь еще более скрыто).

public JsonObject getToken() throws IOException {

    String keycloakServerURL = environmentService.getEnvironmentVariable(EnvironmentService.KEYCLOAK_SERVER);

    String appClientId = environmentService.getEnvironmentVariable(EnvironmentService.APP_CLIENT_ID);
    String appClientSecret = environmentService.getEnvironmentVariable(EnvironmentService.APP_CLIENT_SECRET);

    URL url = new URL(keycloakServerURL + "/auth/realms/XXXXXX/protocol/openid-connect/token");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("POST");

    String userpass = appClientId + ":" + appClientSecret;
    String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));

    con.setRequestProperty("Authorization", basicAuth);
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    /* Payload support */
    con.setDoOutput(true);
    DataOutputStream out = new DataOutputStream(con.getOutputStream());
    out.writeBytes("grant_type=client_credentials");

    out.flush();
    out.close();

    int status = con.getResponseCode();
    BufferedReader in = new BufferedReader(new 
    InputStreamReader(con.getInputStream()));

    JsonReader jsonReader = Json.createReader(in);
    JsonObject responesAsJson = jsonReader.readObject();

    in.close();
    con.disconnect();

    // Pretty Print of String
    ObjectMapper objectMapper = new ObjectMapper();
    String jSonstring = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(responesAsJson);
    logger.info("Response: " + jSonstring);
    // Pretty Print of String

    logger.info("Response status: " + status);

    //String contentString = responesAsJson.toString();
    //logger.info("Response: " + contentString);

    return responesAsJson;
}

затем добавьте роль (аналогично для удаления - см. пост выше)

public void addRole(JsonObject userToken, String userId, RoleRepresentation role) throws IOException {
    String keycloakServerURL = environmentService.getEnvironmentVariable(EnvironmentService.KEYCLOAK_SERVER);


    URL url = new URL(keycloakServerURL + "/auth/admin/realms/XXXXXX/users/" + userId + "/role-mappings/realm");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("POST");

    String accessTokenFromUserToken = userToken.getString("access_token");
    con.setRequestProperty("Authorization", "Bearer " + accessTokenFromUserToken);

    con.setRequestProperty("Content-Type", "application/json");

    /* Payload support */
    con.setDoOutput(true);
    DataOutputStream out = new DataOutputStream(con.getOutputStream());
    JsonObject theBodyPart = Json.createObjectBuilder().
            add("id", role.getId()).
            add("name", role.getName()).
            build();
    JsonArray theBodyPartAsArray = Json.createArrayBuilder().add(theBodyPart).build();
    String theBodyPartAsJson = theBodyPartAsArray.toString();
    out.writeBytes(theBodyPartAsJson);      
    out.flush();
    out.close();

    int status = con.getResponseCode();
    logger.info("Response status: " + status);

    con.disconnect();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...