[ruby-on-rails] RoR Devise:使用用戶名或電子郵件登錄



Question

什麼是讓用戶使用他們的電子郵件地址或用戶名登錄的最佳方式? 我正在使用warden + devise進行身份驗證。 我認為這可能不會太難,但我想我需要一些建議,在哪裡放置所需的所有東西。 也許設計已經提供了這個功能? 就像在config / initializers / devise.rb中一樣,你會寫:

config.authentication_keys = [ :email, :username ]

要求用戶名和電子郵件都可以登錄。但我真的想只為用戶名和電子郵件設置一個字段,並且只需要其中一個字段。 我只是想像一下使用某些ASCII藝術,它應該在視圖中看起來像這樣:

Username or Email:
[____________________]

Password:
[____________________]

[Sign In]



我使用快速入侵,以避免更改任何特定設計代碼並將其用於我的特定場景(我特別將其用於移動應用程序可以在服務器上創建用戶的API)。

我已經為所有設計控制器添加了一個before_filter,如果傳遞了用戶名,我會從用戶名生成一封電子郵件(“#{params [:user] [:username]} @ mycustomdomain.com”並保存用戶。 對於所有其他調用,我基於相同的邏輯生成電子郵件。 我的before_filter看起來像這樣:

def generate_email_for_username
    return if(!params[:user][:email].blank? || params[:user][:username].blank?)
    params[:user][:email] = "#{params[:user][:username]}@mycustomdomain.com"
end

我也在用戶表中保存用戶名,因此我知道以@ mycustomdomain.com結尾的電子郵件用戶是使用用戶名創建的。




使用squeel gem,您可以:

  def self.find_for_authentication(conditions={})
    self.where{(email == conditions[:email]) | (username == conditions[:email])}.first
  end






確保您已添加用戶名字段並將用戶名添加到attr_accessible。 在Users中創建登錄虛擬屬性

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

2)添加登錄到attr_accessible

attr_accessible :login

告訴Devise使用:登錄authentication_keys

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

config.authentication_keys = [ :login ]

在用戶中覆蓋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

更新視圖確保項目中具有Devise視圖,以便您可以自定義它們

remove <%= f.label :email %>
remove <%= f.email_field :email %>
add <%= f.label :login %>   
add <%= f.text_field :login %>



Related