当前,我们基于用户的电子邮件字段对用户进行身份验证。但是,该字段不是唯一的。主要问题在于,我们只应允许基于Users表的user_type字段访问Users。如果有2个条目具有相同的电子邮件,但user_type不同,则我们希望Devise尝试使用user_type ='Admin'的条目登录。
是否有一种方法可以将Devise身份验证限制为仅查看具有user_type ='Admin'的用户,而不查看其他用户?
答案 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。我不能保证在某些情况下不会造成问题。
我添加了此方法,该方法将Devises内部方法之一覆盖到User模型。
def self.find_for_database_authentication(warden_conditions)
where(warden_conditions).where("user_type = 'agent'").first
end
第二种解决方案似乎运行良好。