使用来自不同 table 的字段设计登录 - 与用户相关

Devise Log in using field from different table - Related to User

我的登录设置了 3 个字段,组织(字符串标识符)、电子邮件和密码。

我的用户模型有一个名为 organization_id 的列,用于标识他属于哪个组织。

我已经可以在登录表单上使用公司 ID 登录了。 但是,我需要允许用户使用组织名称登录。属于组织模型的信息。

有没有办法在用户认证之前拦截用户的输入,所以我可以使用输入的组织名称搜索数据库,并将其替换为组织ID,以便以更友好的方式进行认证?

您想要的可能是在您使用 Devise 时修改 User 中包含的 find_for_database_authentication 方法。

这是我们尝试查找资源并对其进行身份验证时使用该方法的地方 -> https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/database_authenticatable.rb#L10

当我们进一步检查它时,我们发现它实际上使用了 Authenticatable 模块中的 find_for_authentication 方法。

这又使用了find_first_by_auth_conditions方法。

所有这些调用都传递用于查找资源的相同密钥。

在最直接的情况下,它是在请求参数中传递的 :email 键,但我们可以更改它

让我们修改 find_for_database_authentication 方法,以便我们首先检查参数,如果传递了 :organization_name 键(我假设这不是调用参数的方式),那么我们将使用此信息来找到资源。

def find_for_database_authnetication(conditions)
  if !condition[:organization_name].blank?
    org = Organization.find_by(name: conditions[:organization_name])
    org.users.find_by(conditions[:email])
  else
    super
  end
end

我写这篇文章时并没有实际测试它,所以请对它持保留态度,但您应该对如何解决您的问题有一个大致的了解。