当前位置: 首页 > 知识库问答 >
问题:

KeyClope-使用ApicCalls向用户添加/删除领域角色

沈子昂
2023-03-14

传递用户表示。id to keydeposerverURL“/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

我能找到的最好的是下面这个,但是我不知道params(路径和请求属性应该是)是什么...

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个答案

姜正初
2023-03-14

根据上面的帖子,邪恶帮我。。。

使用Java(使用JEE 8获得良好的JSON功能)

获取令牌(使用您在KeyClope中设置的客户端,其访问类型为机密,并且可以访问正确的角色(对于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();
}
阎裕
2023-03-14

endpoint是

获取角色映射:

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

添加角色映射:

POST /auth/admin/realms/{Realm}/用户/{userid}/角色映射/领域

删除角色映射:

删除/auth/admin/realms/{Realm}/users/{userid}/role mappings/Realm

您有一个id为dc5572a5-b7e0-4c4b-b841-dc88108df70f的角色,例如名为testrole(当您打开KeyClope管理GUI时,您可以在url中看到它,或者通过其他一些RestAPI请求获取它)

现在,我们有一个类型为POST的请求,请求到endpoint/auth/admin/realms/{Realm}/users/{userid}/role mappings/Realm,其主体类型为application/json,主体值如下

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

成功执行后,您会得到一个HTTP代码为204的响应=

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

如果这解决了你的问题请告诉我

 类似资料:
  • 我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于: 您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。 有没有办法覆盖@PreAuthorize方法或JSON令牌Keyclo

  • 我是新来的python和创建不和谐的机器人在一般情况下,我不能为我的生命弄清楚如何让我的机器人分配一个角色给用户的用户请求。 我在互联网上搜索了几个小时,找到了一些例子,但它们都产生了错误。 以下是我的命令代码: 以下是我得到的错误:

  • 我目前正在构建一个SPA类型的应用程序原型。第一步是用Laravel Passport实现一个API并保护它。为此,我从这个现有的结构中获得灵感: Laravel SPA。问题是,没有一个API URL是受保护的,这意味着,作为用户,我可以从API请求所有信息。 所以我决定从零开始,更加安全。我使用的是一个角色和权限包:Laravel permission。 这是我第一次实现和API,我一直坚持使

  • 本文向大家介绍详解Linux添加/删除用户和用户组,包括了详解Linux添加/删除用户和用户组的使用技巧和注意事项,需要的朋友参考一下 本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数。废话不多说,下面我们来看一下。 1、建用户: adduser phpq                             //新建phpq用户 passwd phpq            

  • 我希望能够运行以开始的命令!suspend,提到一个用户,然后确定一个时间长度,并在指定的时间长度内向提到的用户添加一个名为“suspend”的角色。 我不知道该怎么做,因为我对JDA太不熟悉,无法让它工作。除了实际添加的名为“暂停”的角色之外,我的一切都正常。

  • 我想通过postman中的api将角色添加到特定客户端密钥斗篷中的用户,但我得到了“错误”:“client not Found”这个URL:post-http://localhost:8080/auth/admin/realms/{realmName}/users/{userId}/role-mappings/clients/{clientId} 本机构: