【发布时间】:2021-04-29 09:52:24
【问题描述】:
我对 Rails 还很陌生,但我们有一个使用 Devise 和 Omniauth 进行身份验证的应用程序,并且最近按照用于 Devise 集成的 Omniauth 文档集成了 Omniauth-Saml:https://github.com/omniauth/omniauth-saml#devise-integration 身份验证有效,我们可以创建用户并使用这些帐户没有任何问题。
在 SAML 响应属性中是一个 lacode(4 位字符串)。我们想根据参考 lacode 检查此用户属性。如果他们的cag与参考cag匹配,我们想在user.rb模型中设置verified_at属性。
我已经更新了用户模型并测试我是否将 oauth_lacode 设置为“9064”以匹配 oauth_lacode_ref,然后代码可以正常工作,并且用户的验证时间和日期是在帐户创建时设置的。
app/models/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
当我在日志“NoMethodError(#OneLogin::RubySaml::Attributes:0x00007f7a5040ad40 的未定义方法 `lacode')中看到此错误时,我没有正确映射和调用散列中的 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']} 将 Attribute 映射到对应的 键入信息哈希。还支持以 URI 命名的属性,例如 {:电子邮件 => ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress']}。 注意:所有属性也可以在下面的数组中找到 auth_hash[:extra][:raw_info],所以这个设置应该只用于 映射属于 OmniAuth 信息哈希模式的属性。
最后这句话是否意味着我不需要/不能映射属性。任何人都可以帮助或指出正确的方向吗?
【问题讨论】:
标签: ruby-on-rails devise single-sign-on omniauth omniauth-saml