読者です 読者をやめる 読者になる 読者になる

@Konboi memo

主に技術に関してつらつらと。

deviseでログインにemailではなくusernameを使用する

はじめに

deviseはデフォルトで認証にemailを使うようになっているので、それをusernameに変更してみる

今回は管理画面用に作成したAdminUserでその修正を行なってみた。

devise で ログインにusernameを使用する

カラムを追加する

username のカラムを追加する

  • 追加前の状態
mysql> describe admin_users;
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | int(11)      | NO   | PRI | NULL    | auto_increment |
| email                  | varchar(255) | NO   | UNI |         |                |
| encrypted_password     | varchar(255) | NO   |     |         |                |
| reset_password_token   | varchar(255) | YES  | UNI | NULL    |                |
| reset_password_sent_at | datetime     | YES  |     | NULL    |                |
| remember_created_at    | datetime     | YES  |     | NULL    |                |
| sign_in_count          | int(11)      | YES  |     | 0       |                |
| current_sign_in_at     | datetime     | YES  |     | NULL    |                |
| last_sign_in_at        | datetime     | YES  |     | NULL    |                |
| current_sign_in_ip     | varchar(255) | YES  |     | NULL    |                |
| last_sign_in_ip        | varchar(255) | YES  |     | NULL    |                |
| created_at             | datetime     | NO   |     | NULL    |                |
| updated_at             | datetime     | NO   |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+
13 rows in set (0.04 sec)
  • migration ファイルの作成
bundle exec rails g migration add_username_to_admin_users username:string
  • 実行
bundle exec rake db:migrate
  • 追加された
mysql> describe admin_users;
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | int(11)      | NO   | PRI | NULL    | auto_increment |
| email                  | varchar(255) | NO   | UNI |         |                |
| encrypted_password     | varchar(255) | NO   |     |         |                |
| reset_password_token   | varchar(255) | YES  | UNI | NULL    |                |
| reset_password_sent_at | datetime     | YES  |     | NULL    |                |
| remember_created_at    | datetime     | YES  |     | NULL    |                |
| sign_in_count          | int(11)      | YES  |     | 0       |                |
| current_sign_in_at     | datetime     | YES  |     | NULL    |                |
| last_sign_in_at        | datetime     | YES  |     | NULL    |                |
| current_sign_in_ip     | varchar(255) | YES  |     | NULL    |                |
| last_sign_in_ip        | varchar(255) | YES  |     | NULL    |                |
| created_at             | datetime     | NO   |     | NULL    |                |
| updated_at             | datetime     | NO   |     | NULL    |                |
| username               | varchar(255) | YES  |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+

usernameへのアクセサーを追加する

# app/model/admin_user.rb

attr_accessible :email, :password, :password_confirmation, :remember_me, :username # ←追加
  • usernameを追加する
bundle exec rails c 

> AdminUser.first.update_attributes({username: 'admin'})

username でのログインを許可する

# config/initializers/devise.rb

-  #config.authentication_keys = [ :email ]
+ config.authentication_keys = [ :username ]

ログイン画面のformをemailからtextに変更する

# app/views/device/sesson/new.html.erb

-<%= f.email_field :email, :autofocus => true %></div>
+<%= f.text_field :username, :autofocus => true %></div>

再起動してログインしてみる

問題なくいけた

おまけ

deviceのログインをgetに変更する

デフォルトのままだとログアウトが method="delete" になっているので のでログアウトは get でできるように変更した

# config/initializers/devise.rb

#config.sign_out_via = :delete
config.sign_out_via = :get

課題

このままだと、新規管理ユーザーの登録の時に email, password, username が求められるので

password, username だけにする

migrationあたり修正すればいけそう。



たのしいRuby 第3版
たのしいRuby 第3版
posted with amazlet at 13.05.10
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 10,756