Rails
devise

deviseをユーザー名で登録・ログインできるように修正する

More than 5 years have passed since last update.

環境は rails4.0.2 devise3.2.2 です。

deviseはデフォルトでメールアドレスとパスワードでの登録となっているのですが、

今回はメールアドレスではなくユーザー名で登録・ログインできるように修正します。

rails g devise userでリソースを作成し、まずは登録機能の修正をします。

userテーブルの修正とview側の修正は適宜行っておいてください。

始めに、POSTしたusernameを登録できるように、application_controller.rbを修正しstrong parameterを設定します。


application_controller.rb

  #before_filterを設定

before_filter :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
#strong parametersを設定し、usernameを許可
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :password, :password_confirmation) }
end


次にモデル側を修正します。


user.rb

class User < ActiveRecord::Base

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

#usernameを必須・一意とする
validates_uniqueness_of :username
validates_presence_of :username

#登録時にemailを不要とする
def email_required?
false
end

def email_changed?
false
end

end


ポイントはemail_required?とemail_changed?をオーバーライドし、falseを返却するようにしておく点です。

これをしておかないと、登録時にemailが必須になります。

これで登録はできるようになったので、次はログインできるように修正します。

application_controller.rbのconfigure_permitted_parametersに下記を追加します。


application_controller.rb

    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :remember_me) }


これでログイン時にPOSTしたusernameを利用できるようになります。

次はモデルです。


user.rb

class User < ActiveRecord::Base

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:authentication_keys => [:username]

#usernameを必須とする
validates_uniqueness_of :username
validates_presence_of :username

#usernameを利用してログインするようにオーバーライド
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
#認証の条件式を変更する
where(conditions).where(["username = :value", { :value => username }]).first
else
where(conditions).first
end
end

#emailを不要とする
def email_required?
false
end

def email_changed?
false
end

end


まず:authentication_keys => [:username]を追加して、認証キーをusernameにするよう設定します。

次にdeviseのfind_first_by_auth_conditionをオーバーライドして認証の条件式を変更します。

今回はusernameのみでログインするようにしましたが、メールアドレスかユーザー名どちらでもログイン可能なように変更する事も可能です。