使用 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

错误:找不到要导入的文件或无法读取:引导电子邮件

如何在 openshift 中使用 keycloak 和 spring 读取所有用户?

如何从外部 IDP 读取/导入角色到 Keycloak

如何在 Keycloak 中添加 ipAddres o clientAddress 令牌