如何通过keydove javaapi基于资源类型发出授权请求?

af7jpaap  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(507)

我希望能够使用java授权api从KeyClope 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)

但是,这似乎不合适,因为它不是基于用户的权限,而且如果我尝试使用它,它肯定不会很好地扩展。
那么,如何进行资源类型授权请求呢?

roejwanj

roejwanj1#

所以我找到了另一个解决办法。它并没有真正回答核心问题,而是回答了这背后的需求,即基于权限列出一组特定类型的资源。
我不是用这种字体。我实际上使用了范围权限 AuthorizationRequest 正如最初的问题所解释的那样。我所改变的是keydepot端的配置方式。
创建授权范围,例如。 myresourcetype:read 创建一个资源并设置其作用域。
创建反映访问该资源的条件的策略
使用策略和范围创建基于资源的权限。
现在,如果我执行以下请求:

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"
          }
        ]
      }
    }

这是不理想的,因为我宁愿能够获得资源的基础上,他们的实际类型,但目前这是最好的我可以想出。

相关问题