Edited at

Deviseの設定手順をまとめてみた。 その4 ユーザーIDで、ログイン認証編

--- 全体の流れ ---

その1 導入編

その2 ViewとControllerのカスタマイズ編

その3 Deviseの日本語化編

その4 ユーザーIDで、ログイン認証編 ←今ココ

Deviseって、デフォルトは、メルアドとパスワードでログイン認証させるんだけど、

運用面では、ユーザーIDとパスワードで認証したいケースって多いよね。

なので、手順をまとめてみた。


1. usersテーブルに、以下のカラムを追加


  • カラム名: user_id

  • 型名: string


  • migrationファイルを作成


$ rails g migration add_user_id_to_users user_id:string


  • migrationファイルの修正

class AddUserIdToUsers < ActiveRecord::Migration

def change
add_column :users, :user_id, :string, null: false, default: ""
end
end


  • migrationファイルを実行

$ rake db:migrate


2. usersテーブルに追加したuser_idに、インデックスを追加


  • migrationファイルを作成

$ rails g migration add_user_id_index_to_users


  • migrationファイルに、add_indexを追加

class AddUserIdIndexToUsers < ActiveRecord::Migration

def change
add_index :users, :user_id, unique: true
end
end


  • migrationファイルを実行

$ rake db:migrate


3. usersテーブルのemailのインデックスを削除


  • migrationファイルを作成

$ rails g migration remove_email_index_from_users


  • migrationファイルに、remove_indexを追加

class RemoveEmailIndexFromUsers < ActiveRecord::Migration

def change
remove_index :users, :email
end
end


  • migrationファイルを実行

$ rake db:migrate


4. app/controllers/application_controller.rbに、以下の内容を追記

before_filter :configure_permitted_parameters, if: :devise_controller?

protected

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


5. app/model/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 => [:user_id]

# user_idを必須、一意とする
validates_uniqueness_of :user_id
validates_presence_of :user_id

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

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

def email_changed?
false
end
end


6. config/locales/devise.views.ja.ymlに、以下の箇所を追加

ja:

activerecord:
attributes:
user:
current_password: "現在のパスワード"
email: "メールアドレス"
user_id: "ユーザーID" # ← この1行を追加
password: "パスワード"
password_confirmation: "確認用パスワード"
remember_me: "ログインを記憶"
...


7. app/views/layouts/application.html.erbの、以下の箇所を修正

  <header>

<nav>
<% if user_signed_in? %>
<!-- 修正箇所 START -->
Logged in as <strong><%= current_user.user_id %></strong>.
<!-- 修正箇所 END -->
<%= link_to 'プロフィール変更', edit_user_registration_path %>
<%= link_to 'ログアウト', sign_out_path %>
<% else %>


8. 以下のファイルを、下記のように修正


  • app/views/users/registrations/new.html.erb

  • app/views/users/registrations/edit.html.erb

  • app/views/users/sessions/new.html.erb

  <div class="field">

<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>

  <div class="field">

<%= f.label :user_id %><br />
<%= f.text_field :user_id, autofocus: true %>
</div>

以上です。