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

  • 10
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

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

9. 以上です。

  • どうですかー? うまく出来ましたか?

※ITBOZEによるIT技術の備忘録ブログ
坊主が上手にHatenaに坊主のコードを書いた
もよろしくね!