keycloak - Keycloak:在生成的令牌中包含请求范围的角色
问题描述
我目前正在尝试将 Keycloak 作为 OICD/OAuth 提供程序,并计划根据我的应用程序中的角色将其用于授权。为此,我需要角色来申请包含在生成的访问令牌中的会话。
我的计划如下:
- 定义分配了角色的范围
- 在 Keycloak 中将范围作为可选范围添加到我的应用程序/客户端
- 使用内置的“角色”范围(及其映射器)将有效角色添加到生成的访问令牌作为客户端的默认值
- 期望生成的访问令牌中相关“角色”声明的值等于分配给登录时请求的范围的角色
到目前为止,这一切都是可能的,除了生成的访问令牌中有趣的“角色”声明包含用户的所有角色,而不仅仅是分配给请求范围的角色。
所以我的问题是:
- 是否可以在生成的令牌中包含“角色”声明,只包含可以从请求的范围解析的角色?
例子:
我们有以下范围角色映射:
范围 | 角色 |
---|---|
读 | r_read |
写 | r_write |
以及具有“r_read”和“r_write”角色的用户。
当用户使用请求的“读取”范围登录时,我希望生成的访问令牌中的“角色”数组仅包含“r_read”角色。相反,它目前还包含“r_write”角色。
更新:
经过更多挖掘后,我认为我被“客户端范围”详细信息配置中的“范围”选项卡的文档误导(或误解了它):
Scope mappings allow you to restrict which user role mappings are included within the access token requested by the client.
在那里设置的分配角色仅控制需要哪个角色,以便可以将范围应用于/添加到scope
访问令牌的声明中。
我目前看到的可能性是:
- 只需尝试将角色与范围进行 1:1 映射,并使用应用的范围进行授权(看看是否可行)
- 看看编写我自己的映射器,将作用域解析为角色(看看这是否可能通过使用公共 API 并且不影响性能)
- 摒弃“登录时要求的权限”的想法,只看用户角色
- 并接受 - 例如 - 管理员无法使用用户权限登录
解决方案
是的你可以。简单的方法:
Clients Scopes
在菜单部分[/auth/admin/master/console/#/realms/<your realm>/client-scopes
]中创建所需的范围,将其命名为:(read
例如)
您可以关闭选项Display On Consent Screen
&Include In Token Scope
。我们不需要它范围保存后转到
MAPPER
选项卡(范围read
)
- 按下
CREATE
按钮 - 映射器类型 =
Hardcoded Role
; 名称 =r_read
; 角色=r_read
- 节省!
- 将范围 (
read
) 添加到Optional Client Scopes
您的主客户端[/auth/admin/master/console/#/realms/<your realm>/clients/<your client UUID>/client-scopes/setup-scopes
] - 现在请求具有范围 (
read
)的访问令牌 - 瞧!现在
realm_access.roles
,您的访问令牌部分将如下所示:
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"r_read"
]
}
推荐阅读
- ios - Swift:第一次点击时下拉高度错误
- swift - 比较未来日期和当前日期 SwiftUI
- javascript - 有没有办法判断一个函数在 Javascript 中是否有状态?
- java - 精炼二维数组
- ruby-on-rails - 初始化程序中的 Sidekiq 作业被触发两次
- node.js - 像 Knex 这样的关系数据库框架真的在 NodeJS 上使用异步 IO 吗?
- ros - Webots 中的气味羽流环境
- ios - 如何检查 VMMap 中哪个框架使用了 DefaultMallocZone
- c# - 在运行时创建 HTML 页面
- python - Spotipy 的身份验证问题