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

时间:2014-05-11 17:01:29

标签: ruby-on-rails ruby devise

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

问题是我找不到在运行时从

更改设备配置选项的方法

Config.authentication_keys = [ :username ] #For customers

到:

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

有可能做这样的事吗?

P.S:我尝试向Proc.new {#block}注入Config.authentication_keys以向配置选项添加一些逻辑,但是由于Devise期望该选项是一个数组,它失败了。

例如:

  config.authentication_keys = Proc.new { [ :email ] }  
使用此错误清除devise_parameter_sanitizer.for(:sign_up) << [..]的参数

时,

失败

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

1 个答案:

答案 0 :(得分:2)

您可以覆盖find_first_by_auth_conditions型号的User方法:

# 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]

P.S。:mongoid的示例,我不记得如何为AR调用find。