【问题标题】:How can I make an authorization request based on the resource type through the Keycloak Java API?如何通过 Keycloak Java API 根据资源类型发出授权请求?
【发布时间】:2021-03-13 05:47:32
【问题描述】:

我希望能够使用 Java 授权 API 从 Keycloak UI 重现该行为:

我的目标是获取用户可以访问的特定资源类型的所有资源的列表。 我在这里测试了很多东西。

这将为我提供一个可以访问的每个资源的列表。虽然我担心这不会很好地扩展。

    AuthzClient authzClient = AuthzClient.create();
    AuthorizationResource authorizationResource = authzClient.authorization(keycloakSecurityContext.getTokenString());
    return authorizationResource.authorize().getToken();

这是我用来获取特定范围权限的方法。

    AuthzClient authzClient = AuthzClient.create();
    AuthorizationResource authResource = authzClient.authorization(keycloakSecurityContext.getTokenString());
    AuthorizationRequest authRequest = new AuthorizationRequest();
    authRequest.addPermission(null, SCOPE1);
    authRequest.addPermission(null, SCOPE2);
    return authResource.authorize(authRequest).getToken();

但是我想要的是对特定类型的请求,这似乎是不可能的。

我知道我可以列出特定类型:

authzClient.protection().resource()
    .find(null,null,null,null, "The-Type-I-Want", null, false, 0, Integer.MAX_VALUE)

但同样,这似乎不合适,因为它不是基于用户的许可,如果我尝试使用它肯定不会很好地扩展。

那么如何进行资源类型授权请求?

【问题讨论】:

    标签: java resources authorization keycloak


    【解决方案1】:

    所以我找到了替代解决方案。它并没有真正回答核心问题,而是回答了其背后的需求,即根据权限列出一组特定类型的资源。

    我没有在这里使用该类型。我实际上已经使用了范围权限AuthorizationRequest,正如原始问题所解释的那样。我改变的是 keycloak 端的配置方式。

    1. 创建授权范围,例如myresourcetype:read
    2. 创建资源并在其上设置范围。
    3. 创建反映访问该资源条件的策略
    4. 使用您的策略和范围创建基于资源的权限。

    现在,如果我执行以下请求:

        AuthzClient authzClient = AuthzClient.create();
        AuthorizationResource authResource = authzClient.authorization(keycloakSecurityContext.getTokenString());
        AuthorizationRequest authRequest = new AuthorizationRequest();
        authRequest.addPermission(null, "myresourcetype:read");
        return authResource.authorize(authRequest).getToken();
    

    我可以期待以下类型的答案:

        {
          [...],
          "authorization": {
            "permissions": [
              {
                "scopes": [
                  "myresourcetype:read"
                ],
                "rsid": "f5466ba5-5c2c-4ec9-99f9-123d739f659c",
                "rsname": "myresource1"
              },
              {
                "scopes": [
                  "myresourcetype:read"
                ],
                "rsid": "8ba2df8d-7274-48f2-a26a-edaa44c49c03",
                "rsname": "myresource2"
              }
            ]
          }
        }
    

    这并不理想,因为我宁愿能够根据资源的实际类型获取资源,但目前这是我能想到的最好的。

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2018-07-21
      • 2021-07-05
      • 2020-08-14
      • 2019-05-15
      • 2020-10-08
      • 1970-01-01
      • 2011-01-02
      • 2022-01-10
      相关资源
      最近更新 更多