如何自定义设计,使其仅在一种用户类型上使用用户名作为身份验证密钥,而不是电子邮件



我有两种用户类型,管理员和客户,我一直试图让客户与他们的用户名登录独家,而保持管理员不受影响(即:,仍然登录他们的电子邮件)。我已经完成了在客户登录/注册时删除电子邮件的过程。但事实证明,这个过程也影响了管理员——他们不能再用电子邮件登录了。

问题是我找不到一种方法来改变设计的配置选项在运行时从

Config.authentication_keys = [ :username ] #For customers

:

Config.authentication_keys = [ :email ] #For admins
基于名称空间。

有可能这样做吗?

p。S:我尝试将Proc.new {#block}注入Config.authentication_keys以添加一些逻辑到配置选项,但由于设计期望该选项是数组,因此失败。

例如:

  config.authentication_keys = Proc.new { [ :email ] }  

在使用devise_parameter_sanitizer.for(:sign_up) << [..]消毒参数时失败,出现此错误

undefined method `+' for #<Proc:0x5d872a0>

您可以为User模型重写find_first_by_auth_conditions方法:

# app/models/user.rb
def self.find_first_by_auth_conditions(conditions, opts={})
  if admin?
    find_by(email: conditions[:login])
  else
    find_by(username: conditions[:login])
  end
end
# config/initializers/desvise.rb
Devise.setup do |config|
  config.authentication_keys = [:login]

注::例如mongoid,我不记得如何调用AR查找

最新更新