From 3f11dbe1d56773987f382d67b13985bf7ac1fd88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baza=CC=81n?= Date: Mon, 12 Jun 2017 17:26:38 +0200 Subject: [PATCH] allows login using username or email --- app/models/user.rb | 14 +++++++++++++- app/views/devise/sessions/new.html.erb | 2 +- config/locales/activerecord.en.yml | 1 + config/locales/activerecord.es.yml | 1 + config/locales/devise_views.en.yml | 2 +- config/locales/devise_views.es.yml | 2 +- spec/features/users_auth_spec.rb | 14 +++++++++++++- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 7d696297e..c9aae0143 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -3,7 +3,8 @@ class User < ActiveRecord::Base include Verification devise :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, - :trackable, :validatable, :omniauthable, :async, :password_expirable, :secure_validatable + :trackable, :validatable, :omniauthable, :async, :password_expirable, :secure_validatable, + authentication_keys: [:login] acts_as_voter acts_as_paranoid column: :hidden_at @@ -48,6 +49,7 @@ class User < ActiveRecord::Base attr_accessor :skip_password_validation attr_accessor :use_redeemable_code + attr_accessor :login scope :administrators, -> { joins(:administrators) } scope :moderators, -> { joins(:moderator) } @@ -286,6 +288,16 @@ class User < ActiveRecord::Base end delegate :can?, :cannot?, to: :ability + # overwritting of Devise method to allow login using email OR username + def self.find_for_database_authentication(warden_conditions) + conditions = warden_conditions.dup + if login = conditions.delete(:login) + where(conditions.to_hash).where(["lower(email) = ? OR username = ?", login.downcase, login]).first + elsif conditions.has_key?(:username) || conditions.has_key?(:email) + where(conditions.to_hash).first + end + end + private def clean_document_number diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb index 910135853..da8e74528 100644 --- a/app/views/devise/sessions/new.html.erb +++ b/app/views/devise/sessions/new.html.erb @@ -11,7 +11,7 @@ <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
- <%= f.email_field :email, autofocus: true, placeholder: t("devise_views.sessions.new.email_label") %> + <%= f.text_field :login, autofocus: true, placeholder: t("devise_views.sessions.new.login_label") %>
diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index c9fd00aab..d36a481ae 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -113,6 +113,7 @@ en: description: "Description" terms_of_service: "Terms of service" user: + login: "Email or username" email: "Email" username: "Username" password_confirmation: "Password confirmation" diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml index 7b4fbebeb..f42577ef2 100644 --- a/config/locales/activerecord.es.yml +++ b/config/locales/activerecord.es.yml @@ -108,6 +108,7 @@ es: description: "Descripción" terms_of_service: "Términos de servicio" user: + login: Email o nombre de usuario email: "Correo electrónico" username: "Nombre de usuario" password_confirmation: "Confirmación de contraseña" diff --git a/config/locales/devise_views.en.yml b/config/locales/devise_views.en.yml index bcd1f1a77..4110fb60e 100755 --- a/config/locales/devise_views.en.yml +++ b/config/locales/devise_views.en.yml @@ -68,7 +68,7 @@ en: title: Forgotten password? sessions: new: - email_label: Email + login_label: Email or username password_label: Password remember_me: Remember me submit: Enter diff --git a/config/locales/devise_views.es.yml b/config/locales/devise_views.es.yml index be8aff97b..184454654 100644 --- a/config/locales/devise_views.es.yml +++ b/config/locales/devise_views.es.yml @@ -68,7 +68,7 @@ es: title: "¿Has olvidado tu contraseña?" sessions: new: - email_label: Email + login_label: Email o nombre de usuario password_label: Contraseña remember_me: Recordarme submit: Entrar diff --git a/spec/features/users_auth_spec.rb b/spec/features/users_auth_spec.rb index e978e7bd2..ce272684a 100644 --- a/spec/features/users_auth_spec.rb +++ b/spec/features/users_auth_spec.rb @@ -35,7 +35,19 @@ feature 'Users' do visit '/' click_link 'Sign in' - fill_in 'user_email', with: 'manuela@consul.dev' + fill_in 'user_login', with: 'manuela@consul.dev' + fill_in 'user_password', with: 'judgementday' + click_button 'Enter' + + expect(page).to have_content 'You have been signed in successfully.' + end + + scenario 'Sign in with username' do + create(:user, username: 'larry', email: 'manuela@consul.dev', password: 'judgementday') + + visit '/' + click_link 'Sign in' + fill_in 'user_login', with: 'larry' fill_in 'user_password', with: 'judgementday' click_button 'Enter'