LoginSignup
28
41

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-04-26

--- 全体の流れ ---
その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>

以上です。

28
41
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
41