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版
posted with amazlet at 13.05.10