如何通过 Keycloak Java API 根据资源类型发出授权请求?

Posted

技术标签:

【中文标题】如何通过 Keycloak Java API 根据资源类型发出授权请求?【英文标题】:How can I make an authorization request based on the resource type through the 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)

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

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

【问题讨论】:

【参考方案1】:

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

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

    创建授权范围,例如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"
          
        ]
      
    

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

【讨论】:

以上是关于如何通过 Keycloak Java API 根据资源类型发出授权请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JAVA 通过 REST API 集成 Keycloak 时在 toRepresentation() 处获取 404

如何通过 API 集成 keycloak 短信认证?

如何通过 API 在 keycloak 中忘记密码

如何使用 Java API 从 keycloak 获取用户的名字、姓氏和属性?

如何使用 REST API 在 keycloak 中重置用户密码

如何从 java api 在 keycloak 中设置自定义用户属性