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指出的那样,官方设计维基上还有另一个很好的资源.
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视图,以便您可以自定义它们
Run Code Online (Sandbox Code Playgroud)remove <%= f.label :email %> remove <%= f.email_field :email %> add <%= f.label :login %> add <%= f.text_field :login %>
| 归档时间: |
|
| 查看次数: |
27462 次 |
| 最近记录: |