使用来自不同 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
我写这篇文章时并没有实际测试它,所以请对它持保留态度,但您应该对如何解决您的问题有一个大致的了解。
我的登录设置了 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
我写这篇文章时并没有实际测试它,所以请对它持保留态度,但您应该对如何解决您的问题有一个大致的了解。