问题描述
我对 Rails 还很陌生,但我们有一个使用 Devise 和 Omniauth 进行身份验证的应用程序,并且最近通过遵循用于 Devise 集成的 Omniauth 文档集成了 omniauth-saml:https://github.com/omniauth/omniauth-saml#devise-integration 身份验证有效,我们可以创建用户并且可以毫无问题地使用这些帐户。
在 SAML 响应属性中是一个 lacode(4 位字符串)。我们想根据参考 lacode 检查这个用户属性。如果他们的 cag 与参考 cag 匹配,我们希望在 user.rb 模型中设置 verify_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
我没有正确映射和从哈希中调用 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']} 将 Attribute 映射到对应的 输入信息哈希。还支持 URI 命名的属性,例如 {:电子邮件=> ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress']}。 注意:所有属性也可以在下面的数组中找到 auth_hash[:extra][:raw_info],所以这个设置应该只用于 属于 OmniAuth 信息哈希架构一部分的映射属性。
最后这句话是不是意味着我不需要/不能映射属性。任何人都可以帮助或指出我正确的方向吗?
解决方法
我设法让这个工作。只能使用 Omniauth Hash Schema 中指定的属性名称。
将 lacode 映射到属性语句中的描述,我可以使用“auth.info.description”访问它