8.4.4. 使用 Policy API 管理资源权限
Red Hat Single Sign-On 利用 UMA Protection API 允许资源服务器管理其用户的权限。除了 Resource 和 Permission API 外,Red Hat Single Sign-On 还提供了 Policy API,其中权限可以通过代表他们的用户的资源服务器设置为资源。
Policy API 位于:
http://${host}:${port}/auth/realms/${realm_name}/authz/protection/uma-policy/{resource_id}
此 API 受一个 bearer 令牌保护,该令牌必须表示用户授权给资源服务器以代表其管理权限。bearer 令牌可以是从令牌端点获取的定期访问令牌:
- 资源所有者密码凭证授予类型
- 令牌交换,为使用者是资源服务器的令牌(公共客户端)交换授予某些客户端(公共客户端)的访问令牌
8.4.4.1. 将权限与资源关联 复制链接链接已复制到粘贴板!
要将权限与特定资源关联,您必须发送 HTTP POST 请求,如下所示:
curl -X POST \
http://localhost:8180/auth/realms/photoz/authz/protection/uma-policy/{resource_id} \
-H 'Authorization: Bearer '$access_token \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"name": "Any people manager",
"description": "Allow access to any people manager",
"scopes": ["read"],
"roles": ["people-manager"]
}'
在上面的示例中,我们会创建新权限并将其与 resource_id 表示的资源关联,其中任何具有 role people-manager 的用户都应该被 读取 范围授予。
您还可以使用其他访问控制机制创建策略,比如使用组:
curl -X POST \
http://localhost:8180/auth/realms/photoz/authz/protection/uma-policy/{resource_id} \
-H 'Authorization: Bearer '$access_token \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"name": "Any people manager",
"description": "Allow access to any people manager",
"scopes": ["read"],
"groups": ["/Managers/People Managers"]
}'
或者一个特定的客户端:
curl -X POST \
http://localhost:8180/auth/realms/photoz/authz/protection/uma-policy/{resource_id} \
-H 'Authorization: Bearer '$access_token \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"name": "Any people manager",
"description": "Allow access to any people manager",
"scopes": ["read"],
"clients": ["my-client"]
}'
或者使用 JavaScript 来使用自定义策略:
上传脚本 已弃用,并将在以后的版本中删除。此功能默认为禁用。
使用 -Dkeycloak.profile.feature.upload_scripts=enabled 来启用服务器。如需了解更多详细信息,请参阅 配置文件。
curl -X POST \
http://localhost:8180/auth/realms/photoz/authz/protection/uma-policy/{resource_id} \
-H 'Authorization: Bearer '$access_token \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"name": "Any people manager",
"description": "Allow access to any people manager",
"scopes": ["read"],
"condition": "if (isPeopleManager()) {$evaluation.grant()}"
}'
也可以设置这些访问控制机制的任意组合。
要更新现有权限,请按如下所示发送 HTTP PUT 请求:
curl -X PUT \
http://localhost:8180/auth/realms/photoz/authz/protection/uma-policy/{permission_id} \
-H 'Authorization: Bearer '$access_token \
-H 'Content-Type: application/json' \
-d '{
"id": "21eb3fed-02d7-4b5a-9102-29f3f09b6de2",
"name": "Any people manager",
"description": "Allow access to any people manager",
"type": "uma",
"scopes": [
"album:view"
],
"logic": "POSITIVE",
"decisionStrategy": "UNANIMOUS",
"owner": "7e22131a-aa57-4f5f-b1db-6e82babcd322",
"roles": [
"user"
]
}'