0

我对 Rails 很陌生,但我们有一个使用 Devise 和 Omniauth 进行身份验证的应用程序,并且最近按照用于 Devise 集成的 Omniauth 文档集成了 Omniauth-Saml:https ://github.com/omniauth/omniauth-saml#devise-集成身份验证有效,我们可以毫无问题地创建用户和使用这些帐户。

在 SAML 响应属性中是一个 lacode(4 位字符串)。我们想根据参考 lacode 检查此用户属性。如果他们的cag 与参考cag 匹配,我们想在user.rb 模型中设置verified_at 属性。

我已经更新了用户模型并测试我是否将 oauth_lacode 设置为“9064”以匹配 oauth_lacode_ref 然后代码有效并且用户的验证时间和日期在帐户创建时设置。

应用程序/模型/user.rb

  # Get the existing user by email if the provider gives us a verified email.
  def self.first_or_initialize_for_oauth(auth)
    oauth_email           = auth.info.email
    oauth_email_confirmed = oauth_email.present? && (auth.info.verified || auth.info.verified_email)
    oauth_lacode              = auth.extra.raw_info.lacode
    oauth_lacode_ref          = "9064"
    oauth_lacode_confirmed    = oauth_lacode == oauth_lacode_ref
    oauth_user            = User.find_by(email: oauth_email) if oauth_email_confirmed

    oauth_user || User.new(
      username:  auth.info.name || auth.uid,
      email: oauth_email,
      oauth_email: oauth_email,
      password: Devise.friendly_token[0, 20],
      terms_of_service: "1",
      confirmed_at: oauth_email_confirmed ? DateTime.current : nil,
      verified_at: oauth_lacode_confirmed ? DateTime.current : nil
    )
  end

我没有正确映射和调用散列中的 lacode,因为我在日志中看到此错误“NoMethodError(#OneLogin::RubySaml::Attributes:0x00007f7a5040ad40 的未定义方法 `lacode'):”

这就是我在 config/initializers/devise.rb 中映射属性的方式

 attribute_statements: { email: ['urn:oid:0.9.2342.19200300.100.1.22'],
                                        lacode: ['urn:oid:0.9.2342.19200300.100.1.17']}

我已向 IDP 确认 'urn:oid:0.9.2342.19200300.100.1.17' 已映射到 SAML 响应中的 lacode。

与上面的 User 模型一样,这就是我尝试从 User 模型中访问 lacode 的方式。“saml_cag = auth.extra.raw_info.lacode”

这是来自 Omniauth Saml 的指导:

:attribute_statements - 用于将 SAMLResponse 中的属性名称映射到 OmniAuth 信息哈希中的条目。例如,如果您的 SAMLResponse 包含一个名为“EmailAddress”的属性,请指定 {:email => ['EmailAddress']} 以将该属性映射到信息哈希中的相应键。还支持以 URI 命名的属性,例如 {:email => ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress']}。注意:所有属性也可以在 auth_hash[:extra][:raw_info] 下的数组中找到,因此此设置应仅用于映射属于 OmniAuth 信息哈希模式的属性。

最后这句话是否意味着我不需要/不能映射属性。任何人都可以帮助或指出我正确的方向吗?

4

1 回答 1

0

我设法让这个工作。只能使用在Omniauth Hash Schema中指定的属性名称。

将 lacode 映射到属性语句中的描述,我可以使用“auth.info.description”访问它

于 2021-01-28T15:22:50.923 回答