设计-使用非唯一字段对用户进行身份验证

时间:2019-06-04 23:54:54

标签: authentication devise

当前,我们基于用户的电子邮件字段对用户进行身份验证。但是,该字段不是唯一的。主要问题在于,我们只应允许基于Users表的user_type字段访问Users。如果有2个条目具有相同的电子邮件,但user_type不同,则我们希望Devise尝试使用user_type ='Admin'的条目登录。

是否有一种方法可以将Devise身份验证限制为仅查看具有user_type ='Admin'的用户,而不查看其他用户?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的2种方法

我首先想到的就是简单地创建一个名为AdminUser的User模型的子类,其默认范围仅允许user_type ='admin'

class AdminUsers < User
  default_scope { where(user_type: 'admin') }
end

然后我刚刚更新了route.rb文件以使用该模型而不是User

devise_for(
  :users,
  class_name: 'AdminUser',
  path:       'auth',
  controllers: {
    sessions: 'authentications',
    passwords: 'passwords'
  }
)

这很好。唯一的小事情是,现在current_user返回一个AdminUser实例而不是User。我不能保证在某些情况下不会造成问题。

第二个解决方案是从这里:https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address

我添加了此方法,该方法将Devises内部方法之一覆盖到User模型。

def self.find_for_database_authentication(warden_conditions)
  where(warden_conditions).where("user_type = 'agent'").first
end

第二种解决方案似乎运行良好。