8.3. 用户管理的访问
红帽构建的 Keycloak 授权服务基于用户管理的访问或 UMA (简称)。UMA 是一个规格,它通过以下方法增强了 OAuth2 功能:
隐私性
随着更多数据和设备可用并连接到云,用户隐私日会变得巨大的关注。对于 UMA 和 Red Hat build of Keycloak,资源服务器可以增强其功能,以便改进其资源如何保护其资源,以根据用户定义的策略授予权限。
第三方授权
资源所有者(例如:常规最终用户)可以管理对其资源的访问,并授权其他各方(例如,常规最终用户)访问这些资源。这与 OAuth2 不同,其中同意代表用户代表客户端应用程序,使用 UMA 资源所有者以完全异步的方式同意其他用户的访问权限。
资源共享
资源所有者可以管理其资源的权限,并决定谁可以访问特定资源以及如何访问。然后,Red Hat build of Keycloak 可以充当共享管理服务,资源所有者可以从中管理其资源。
红帽构建的 Keycloak 是兼容 UMA 2.0 的授权服务器,可提供大多数 UMA 功能。
例如,考虑使用互联网银行服务(资源服务器)来管理她银行帐户(资源)的用户 alice (资源所有者)。第一天,Alice 决定向 Bob (请求方)开放她的银行帐户。但是,Bob 只能具有查看(范围)vid 帐户的访问权限。
作为资源服务器,互联网银行服务必须能够保护 alice 的银行帐户。为此,它依赖红帽构建 Keycloak 资源注册端点,从而在代表 alice's bank 帐户的服务器中创建资源。
目前,如果 Bob 试图访问 alice 的银行帐户,则访问将被拒绝。互联网银行服务为银行帐户定义了几个默认策略。其中之一就是,只有所有者,在本例中为 alice,可以访问她的银行帐户。
但是,Internet 银行服务会遵守 alice 的隐私,也允许她更改银行帐户的特定策略。她可能会更改的其中一项策略是定义允许哪些人查看其银行帐户。为此,互联网银行服务依赖于红帽构建的 Keycloak 来为 alice 提供空间,其中她可以选择个人和允许访问的操作(或数据)。在任何时候,vovid 可以撤销访问权限,或向 Bob 授予其他权限。
8.3.1. 授权过程 复制链接链接已复制到粘贴板!
在 UMA 中,当客户端尝试访问 UMA 保护的资源服务器时,授权过程会启动。
UMA 保护的资源服务器在请求中需要一个 bearer 令牌,其中令牌是 RPT。当客户端在没有 RPT 的情况下在资源服务器上请求资源时:
客户端请求受保护的资源,而不发送 RPT
curl -X GET \
http://${host}:${port}/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
curl -X GET \
http://${host}:${port}/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
资源服务器将响应发送回带有权限 票据 的客户端,以及红帽构建的 Keycloak 服务器的位置的 as_uri 参数,以便获取 RPT。
资源服务器使用权限票据响应
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm-name}",
as_uri="https://${host}:${port}/realms/${realm-name}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm-name}",
as_uri="https://${host}:${port}/realms/${realm-name}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
权限票据是红帽构建的 Keycloak 权限 API 发布的特殊类型的令牌。它们表示正在请求的权限(例如:资源和范围)以及与请求关联的任何其他信息。只有资源服务器才能创建这些令牌。
现在,客户端有权限票据,以及红帽构建的 Keycloak 服务器的位置,客户端可以使用发现文档来获取令牌端点的位置并发送授权请求。
客户端向令牌端点发送授权请求,以获取 RPT
curl -X POST \
http://${host}:${port}/realms/${realm-name}/protocol/openid-connect/token \
-H "Authorization: Bearer ${access_token}" \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "ticket=${permission_ticket}
curl -X POST \
http://${host}:${port}/realms/${realm-name}/protocol/openid-connect/token \
-H "Authorization: Bearer ${access_token}" \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "ticket=${permission_ticket}
如果红帽构建的 Keycloak 评估过程造成权限不足,它会发出与权限关联的 RPT:
红帽构建的 Keycloak 使用 RPT 响应客户端
在使用其他授权类型时,来自服务器的响应就像来自令牌端点的任何其他响应一样。RPT 可以从 access_token 响应参数获得。如果客户端没有授权红帽构建的 Keycloak 权限,使用 403 HTTP 状态代码进行响应:
红帽构建的 Keycloak 拒绝授权请求
8.3.2. 提交权限请求 复制链接链接已复制到粘贴板!
作为授权过程的一部分,客户端需要首先从 UMA 保护的资源服务器获取权限票据,以便在红帽构建的 Keycloak Token Endpoint 中使用 RPT 进行交换。
默认情况下,红帽构建的 Keycloak 会以 403 HTTP 状态代码和 request_denied 错误(如果客户端无法使用 RPT )进行响应。
红帽构建的 Keycloak 拒绝授权请求
此类响应意味着红帽构建的 Keycloak 无法发布 RPT,其权限由权限票据表示。
在某些情况下,客户端应用程序可能希望启动异步授权流,并让请求的资源所有者决定是否应授予访问权限。为此,客户端可以使用 submit_request 请求参数以及对令牌端点的授权请求:
使用 submit_request 参数时,红帽构建的 Keycloak 将为每个访问失败的资源保留权限请求。创建后,资源所有者可以检查其帐户并管理其权限请求。
您可以将此功能视为应用程序中的 请求访问 按钮,用户可以向其他用户询问其他用户访问其资源。
8.3.3. 管理对用户资源的访问 复制链接链接已复制到粘贴板!
用户可以使用红帽构建的 Keycloak 帐户控制台来管理对其资源的访问。要启用此功能,您必须首先为您的域启用用户管理的访问。
流程
- 登录管理控制台。
- 单击菜单中的 Realm Settings。
- 将 用户管理的访问切换为 ON。
单击 Admin Console 右上角的用户名,再选择 Manage Account。
单击菜单选项中的 My Resources。将显示带有以下选项的页面。
管理 我的资源
本节包含由用户拥有的所有资源的列表。用户可以单击资源以了解更多详细信息,并与其他资源共享。当权限请求是等待批准时,会在资源名称旁边放置一个图标。这些请求连接到请求访问特定资源的各方(用户)。允许用户批准或拒绝这些请求。您可以点击图标完成此操作
管理与我共享的资源
本节包含与用户共享的所有资源的列表。
通过访问此资源来管理人员
本节包含有权访问此资源的人员的列表。用户可以通过单击
Revoke按钮或删除特定的权限来撤销访问权限。与其他人共享资源
通过输入其他用户的用户名或电子邮件,用户可以共享该资源,然后选择他想要授予访问权限的权限。