如何通过 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
如何使用 Java API 从 keycloak 获取用户的名字、姓氏和属性?