使用 Ruby 2.7 读取 Keycloak OmniAuth::AuthHash 元素
Posted
技术标签:
【中文标题】使用 Ruby 2.7 读取 Keycloak OmniAuth::AuthHash 元素【英文标题】:Reading Keycloak OmniAuth::AuthHash elements with Ruby 2.7 【发布时间】:2022-01-23 21:50:47 【问题描述】:从 Keycloak 身份验证令牌中,我读取了 OmniAuth::AuthHash 元素以提取用户的姓名、电子邮件和角色。
根据通过auth = request.env["omniauth.auth"]
语句检索到的令牌,读取姓名和电子邮件非常容易。
深入研究令牌的层次结构提供了请求的信息:
user.name = auth.info.name
user.uuid = auth.uid
user.provider = auth.provider
user.email = auth.info.email
我用同样的方法搜索用户的角色列表:
roles = auth.extra.raw_info.resource_access
提供以下 AuthHash:
#<OmniAuth::AuthHash
BFS.SIS=#<OmniAuth::AuthHash
roles=#<Hashie::Array
["dataproducer",
"fsodataconsumer",
"sisdatasteward"]
>
>
BFS.SIS.DAL=#<OmniAuth::AuthHash
roles=#<Hashie::Array
["kd_getLoadReports",
"kd_createTables",
"kd_readTables",
"kd_deleteTables"]
>
>
BFS.SIS.DPS.KEYSTORE=#<OmniAuth::AuthHash
roles=#<Hashie::Array
["keymanagement_key_read",
"keymanagement_keystore_read"]
>
>
BFS.SIS.SMS=#<OmniAuth::AuthHash
roles=#<Hashie::Array
["kdDatasetInformation_read",
"codeLists_update",
"definedVariables_set_status_validation_in_progress",
"hierarchicalCodeLists_update",
"hierarchicalCodeLists_create",
"kdDatasetInformation_delete",
"kdDatasetInformation_update",
"kdDataStructureDefinitions_create",
"kdDataStructureDefinitions_update",
"kdDataStructureDefinitions_delete",
"kdDataStructureDefinitions_read",
"kdDatasetInformation_create",
"definedVariables_set_status_open_from_rejected"]
>
>
BFS.SIS.UI=#<OmniAuth::AuthHash
roles=#<Hashie::Array
["bfs.sis.portal"]
>
>
>
存在问题:由于键名包含“.”,我无法继续使用语法 key.subkey 访问子键来检索 BFS.SIS 和 BFS.SIS 的角色数组.SMS 密钥。
如何从这些键中提取数组?
感谢您的帮助!
【问题讨论】:
【参考方案1】:好吧,我无法深入研究 hash key.subkey 语法,但我可以枚举子键。然后我可以检查一些是否与需要的条目匹配,并提取子角色。
这是我实施的解决方案:
auth = request.env["omniauth.auth"]
roles = Array.new
activities = auth.extra.raw_info.allowlists.statisticalActivities
resources_accesses = auth.extra.raw_info.resource_access
resources_accesses.each do |access|
puts access # Provides the resources_access hash
puts access[0] # Provides the resources_access label
puts access[1] # Provides the resources_access roles array
# Check if label matches needed entries
if ["BFS.SIS.SMS", "BFS.SIS", "BFS.SIS.SCHEDULER"].include? access[0].to_s
access[1].roles.each do |role|
# Store each role in the roles array
roles << role
end
end
end
此用户角色列表将有助于构建 CanCanCan gem 的能力列表。
【讨论】:
以上是关于使用 Ruby 2.7 读取 Keycloak OmniAuth::AuthHash 元素的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Ruby on Rails 应用程序上使用 ruby 2.7
ruby 访问修饰符,不同版本的不同输出 2.5 - 2.7