devise の認証をメールアドレスではなくユーザ名で行うように変更

投稿者: | 2019年9月13日

ここまでは Devise のデフォルト設定のままメールアドレスを利用して認証を行ってきました。次にメールアドレスをのかわりにユーザ名を用いて認証を行うようにしてみたいと思います。

大体の手順は以下のとおりです。

  1. User モデルにユーザID (username) を追加する migration の実施
  2. devise の設定を変更して、username での認証に切り替え
  3. User の Devise controller を作成する。
  4. 上記で追加した controller で、username を parameter として定義
  5. devise で使用している View を、username に対応するように書き換え

User モデルに username を追加

まずは、User モデルに username を追加します。

次に、emacs 等で migration ファイルを編集して、unique 等を設定します。

migration ファイルを編集したら、migration を実行します。

username での認証に切り替え

次に、Devise の設定変更を行い、email のかわりに username で認証するように変更します。
config/initializers/devise.rb の以下の部分を変更します。必須なのは config.authentication_keys の指定で :email から :username に変更するところです。

User モデルに対応した controller の作成と username 対応

いくつかの記事では、ここで application controller でパラメータの許可を書いていたりしますが、アプリケーション全体に関係する話でもないのに application controller に書くのはちょっとイヤンな感じなので、ここはキッチリと Devise 用の controller を作成して対応します。

今回使用している User モデルに対応した controller を作成します。

インストラクションにあるように、config/routes.rb を編集して、session と registration の Controller として、先ほど作成した Controller を使用するように指定します。

編集したら、ちゃんと新しく作った controller に routing されているか確認します。

username を parameter として使用可能にする

次に、ログイン制御の sessions, ユーザ登録内容管理の registrations で :username を使用しているので、それぞれの controller で username を parameter として使用可能とします。

app/controllers/users/sessions_controller.rb

一番上の before_action と、一番下の方に protected 周りがコメントアウトされているので、以下のように変更します。

app/controllers/users/registrations_controller.rb

同様に、一番上の brefore_action と一番下の方に protected 周りがコメントアウトされているので、以下のように変更します。

devise で使用している View を、username に対応するように書き換え

app/view/users/sessions および app/view/users/registrations 以下の View を username に対応するように書き換えます。

app/view/users/sessions/new.html.erb

app/view/users/registrations/new.html.erb

app/view/users/registrations/edit.html.erb

動作確認

ここまでできたら、サーバを再起動して動作を確かめてみましょう。

ユーザ名ありで登録して、ユーザ名でログインできればオッケーです。こんな感じ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です