RoR Devise:使用用户名或电子邮件登录

Pat*_*ity 59 authentication ruby-on-rails devise

什么是让用户使用他们的电子邮件地址或用户名登录的最佳方式?我正在使用warden + devise进行身份验证.我认为这可能不会太难,但我想我需要一些建议,在哪里放置所需的所有东西.也许设计已经提供了这个功能?就像在config/initializers/devise.rb中一样,你会写:

config.authentication_keys = [ :email, :username ]
Run Code Online (Sandbox Code Playgroud)

要求用户名和电子邮件都可以登录.但我真的希望只有一个字段用于用户名和电子邮件,并且只需要其中一个.我只是想象一下使用某些ASCII艺术,它应该在视图中看起来像这样:

Username or Email:
[____________________]

Password:
[____________________]

[Sign In]
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 46

我找到了解决问题的方法.我对它不太满意(我宁愿在初始化程序中指定它),但它现在有效.在用户模型中,我添加了以下方法:

def self.find_for_database_authentication(conditions={})
  find_by(username: conditions[:email]) || find_by(email: conditions[:email])
end
Run Code Online (Sandbox Code Playgroud)

正如@sguha和@Chetan指出的那样,官方设计维基上还有另一个很好的资源.

  • 它还详细介绍了设计维基https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address (8认同)

Mar*_*ski 9

def self.find_for_authentication(conditions)
  conditions = ["username = ? or email = ?", conditions[authentication_keys.first], conditions[authentication_keys.first]]
  # raise StandardError, conditions.inspect
  super
end
Run Code Online (Sandbox Code Playgroud)

用他们的例子!


小智 7

确保您已添加用户名字段并将用户名添加到attr_accessible.在"用户"中创建登录虚拟属性

1)将登录名添加为attr_accessor

# Virtual attribute for authenticating by either username or email
# This is in addition to a real persisted field like 'username'
attr_accessor :login
Run Code Online (Sandbox Code Playgroud)

2)添加登录attr_accessible

attr_accessible :login
Run Code Online (Sandbox Code Playgroud)

告诉Devise使用:登录authentication_keys

修改config/initializers/devise.rb以具有:

config.authentication_keys = [ :login ]
Run Code Online (Sandbox Code Playgroud)

在用户中覆盖Devise的find_for_database_authentication方法

# Overrides the devise method find_for_authentication
# Allow users to Sign In using their username or email address
def self.find_for_authentication(conditions)
  login = conditions.delete(:login)
  where(conditions).where(["username = :value OR email = :value", { :value => login }]).first
end
Run Code Online (Sandbox Code Playgroud)

更新视图确保项目中具有Devise视图,以便您可以自定义它们

remove <%= f.label :email %>
remove <%= f.email_field :email %>
add <%= f.label :login %>   
add <%= f.text_field :login %>
Run Code Online (Sandbox Code Playgroud)