【Rails】deviseの使い方を徹底解説!
deviseとは
railsのgemの一つでログイン認証機能を簡単に実装することができます。
ログイン認証ってなに?
ログイン認証とは簡単にいうとログイン、ログアウト機能のことです。
ログインするにはまずサインアップ(新規登録)をする必要があるので、ユーザー登録も必要になります。
これを自分で実装しようとすると非常に大変です。
ですがdeviseというgemを使えば簡単に実装することができます。
gemをインストールしよう
それではrailsのアプリにdeviseをインストールしてみましょう。
Gemfileの一番下にこのように記述してください。
1
gem 'devise'
その後、ターミナルで「bundle install」を行いましょう。
次にターミナルで下記のコマンドを実行してください。
1
$ rails g devise:install
以下のようにターミナルに出力されればインストールに成功しています。
ここで出力されるメッセージの内容を確認してみましょう。
1. 新規登録などで認証メールを送った際、メールの文中にある認証リンクのURLを設定します。
設定するファイルは「config/environments/development.rb」です。
出力された内容にある通り下記のように設定します。
1
config.action_mailer.default_url_options = { protocol: 'https', host: 'トップページアドレス' }
デフォルトだと{ host: 'localhost', port: 3000 }になっています。
2. ルートを設定します。
deviseだと会員登録完了後などにルートに飛ぶ設定になっているため、あらかじめ「config/routes.rb」でルートを設定する必要があります。
3. フラッシュメッセージ用のタグをビューに埋め込みます。
1
2
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
これはflashメッセージというもので、それぞれ「notice」,「alert」という変数に格納されています。
ログインした際やログアウトした際、フォームの送信エラーなど簡単な通知をしたい場合に使用します。
フラッシュメッセージを表示させたい時はこのコードを共通のビューである「app/views/layouts/application.html.erb」に追記します。
4. deviseのビューをカスタマイズする時は下記のコマンドを実行します。
1
$ rails g devise:views
deviseでは認証周りのビューファイルは最初から用意されています。
しかしデフォルトのビューは非常に簡素なので、自分でカスタマイズする際にはこのコマンドを使い、ビューファイルを作成し、作成されたファイルを編集します。
deviseを使ってユーザーモデルを作ろう
認証が使えるモデルを作成する際には通常のモデルを作成するコマンドである「rails g model モデル名」ではなく、「rails g devise モデル名」というコマンドを使います。
userというモデルを作成する際は下記のコマンドになります。
1
$ rails g devise user
このコマンドでモデルを作成するとログイン認証をするためのファイルが自動で作成され、認証機能を使えるようになります。
それと同時にroutes.rbに「devise_for :users」が追記されます。
この記述により下記のようにサインアップや、ログインなど認証のためのルーティングが自動で作成されます。
devise_for :モデル名
「devise_for」はdeviseのヘルパーメソッドです。
「:モデル名」を指定すると認証に必要なルーティングを自動で設定してくれます。
この記述の追加と同時にマイグレーションファイルも作成されます。
deviseで定義されているモジュールを確認しよう
マイグレーションファイルを確認するとdeviseで定義されたモジュールの設定が書かれています。
それぞれのモジュールがどういう機能を持つのか確認しておきましょう。
Database authenticatable
データベースに保存されたパスワードが正しいか検証をします。
同時にパスワードの暗号化も行います。
Recoverable
パスワードをリセットします。
Trackable
ログインした回数、最終ログイン日時、前回ログイン日時、最終ログインIP、前回ログインIPを保存します。
Confirmable
新規登録時にメール認証機能をつけます。
Lockable
ログインに何度も失敗すると、アカウントをロックします。
何回失敗するとロックするかはこのLockable内で指定します。
以上がマイグレーションファイルに設定されています。
初期状態だとコメントアウトされているものもあるので、使いたい場合はコメントアウトを外しておきましょう。
その他に用意されているモジュール
マイグレーションファイルに記述されている以外にもモジュールが用意されています。
Timeoutable
ログインしたままの状態で一定時間経つと自動でログアウトさせます。
デフォルトだと30分になっています。
有効期限を自身で設定したい場合は「config/initializers/devise.rb」に下記を追記します。
1
2
# 1ヶ月と指定
config.timeout_in = 1.month
次にrailsの有効期限を設定します。
「config/initializers/session_store.rb」を下記のように編集します。
1
TechReviewSite::Application.config.session_store :cookie_store, key: '自分のアプリの設定_session', expire_after: 1.month'
こうすることにより1ヶ月はログインセッションが保持され、1ヶ月以内にアクセスすればさらに1ヶ月セッション時間が保持されます。
Validatable
Emailやパスワードのバリデーションを追加します。
Omniauthable
twitterやFacebookなどのSNS認証を追加します。
モジュールの使い方
これらのモジュールを使いたい場合は「app/models/users.rb」で下記のように指定します。
1
2
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
上の指定だと5つのモジュールが使えます。
使いたいモジュールを追記すれば使用可能になります。
deviseのヘルパーメソッド
deviseでは便利なヘルパーメソッドがたくさん用意されています。
主なものを確認しておきましょう。
※「user」の部分はモデル名になるので、「rails g devise teacher」でteacherモデルを作成している時は「teacher」などに置き換えてください。
current_user
現在ログインしているユーザーのレコードを取得できます。
現在ログインしているユーザーのidを取得する際は「current_user.id」で取得できます。
user_signed_in?
ユーザーがサインしていればtrueが、サインアウトしていればflaseが返ってくるメソッドです。
ビューでcurrrent_userを使う際、ログインしていない場合、エラーになってしまうので、このメソッドで条件分岐をする必要があります。
authenticate_user!
「before_action :authenticate_user!」みたいにbefore_actionと併用して使います。
この一文をコントローラーの最初に記述しておくことにより、ユーザがログインしていない場合はログインページにリダイレクトさせます。
投稿はログインしていないとできないようにする際などに使用します。
「only」や「except」でアクションを設定することが多いです。
configure_permitted_parameters
作成したモデルにストロングパラメーターを追加したい場合に使用します。
デフォルトだとメールアドレスとパスワードのみストロングパラメーターがかかっています。
使用する際は「application_controller」にbefore_actionを使って記述します。
1
2
3
4
5
6
7
before_action :configure_permitted_parameters, if: :devise_controller?
#新規登録時のストロングパラメータに「nicknameカラム」の追加
def configure_permitted_parameters
#新規登録時のストロングパラメータに「nicknameカラムとageカラム」の追加
devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :age])
end
第一引数は下記のように指定できます。
- sign_up: 新規登録時
- sign_in: ログイン時
- account_update: 更新時
deviseを日本語化しよう
デフォルト状態だとフラッシュメッセージなどが英語なので日本語に変更しましょう。
公式サイトにもやり方が載っています。
まずは「config/application.rb」に下記のコードを追記します。
1
config.i18n.default_locale = :ja
次に「config/locales」フォルダ内に「devise.ja.yml」というファイルを作成します。
作成したファイルに公式サイトに掲載されている内容をコピーします。
もう一つ「config/locales」フォルダ内に「ja.yml」というファイルを作成します。
作成したファイルに公式サイトに掲載されている内容をコピーします。
これで日本語化は完了です。
ビューを変更しよう
投稿フォームのデザインはdeviseで用意されています。
ただシンプルなので自分のアプリに合ったデザインに変更するのが良いでしょう。
その際は下記のコマンドを入力します。
1
$ rails g devise:views
するとviewsフォルダに「devise」が作成されます。
各フォルダがどのビューに対応しているか確認してみましょう。
フォルダ名 | ファイル名 | 内容 |
---|---|---|
confirmations | new | パスワード再発行時のフォーム |
mailer | 後述 | 送信されるメールの内容(下記に詳細) |
passwords | edit | パスワード編集フォーム |
passwords | new | パスワードを忘れた時のフォーム |
registrations | edit | ユーザー情報編集フォーム |
registrations | new | 新規登録のフォーム |
sessions | new | ログインフォーム |
shared | _link | 各フォームに表示されるリンクの部分テンプレート |
unlocks | new | アカウントロック通知メールを送信するフォーム |
フラッシュメッセージが表示されるようにしよう
フラッシュメッセージはログインした際や、何らかのエラーメッセージを簡易的に表示させるものです。
deviseでは自動的にフラッシュメッセージを表示してくれます。
そのための設定を行いましょう。
いろんなページで使うので部分テンプレートとして作成します。
1
2
3
4
5
6
<% if notice %>
<p><%= notice %></p>
<% end %>
<% if alert %>
<p><%= alert %></p>
<% end %>
フラッシュメッセージには「notice」と「alert」の2種類があり、「notice」はログインに成功した時とか、投稿に成功した時など動作が正常に動いた時などに表示されます。
それに対し「alert」は動作が失敗したりエラーが出た時に表示されます。
pタグにそれぞれスタイルを設定しておくと良いでしょう。
この部分テンプレートをフラッシュメッセージを表示させたい箇所で呼び出します。
メール認証機能をつけよう
deviseを使うとユーザー登録の時にメール認証機能をつけることができます。
メール認証は何かというとユーザー登録をした後、登録したメールアドレスにメールを送り、そのメール内にあるリンクをクリックするとユーザー登録が完了するという機能です。
実装するまでに手順を確認しておきましょう。
ユーザーモデルを編集しよう
メール認証機能を使うには上の説明でもあったようにdeviseで用意されているモジュールを使用します。
下記のようにuser.rbに「:confirmable」を追記します。
1
2
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
メール送信用サーバーの設定をしよう
次にメール送信用サーバーの設定をします。
「config/environments/development.rb」に下記のコードを追加します。
1
2
3
4
5
6
7
8
9
10
11
12
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => 'smtp.gmail.com',
:user_name => "メールアドレス",
:password => "パスワード",
:authentication => 'login'
}
メールアドレスにはgmailでないとダメみたいなので、gmailで設定してください。
パスワードの部分はgmailのログインパスワードです。
もし二段階認証をしている場合はアプリパスワードというのを取得しなくてはなりません。
アプリパスワード
二段階認証をしている場合、その都度パスワードが変わるのでここでは直接記述することができません。
ですので二段階認証時のパスワードとは別にアプリパスワードというのを使用します。
アプリパスワードは下記の順番で取得することができます。
1. googleアカウントページへ行く。
2. セキュリティをクリックする。
- 2段階認証プロセスがオンになっているのを確認し、アプリパスワードをクリックする。
4. 本人認証後、下の画面になるので、「その他(名前を入力)」を選択し、自分のアプリ名を入力する。
5. アプリパスワードが生成されるので、コピーをする。
これでアプリ生成パスワードが確認できました。
このパスワードを上のdevelopment.rbに記述しましょう。
devise.rbを編集しよう
次に「config/initialiezers/devise.rb」を編集します。
下記のコードを追記してください。
1
config.mailer_sender = 'アプリで使用するgmailアドレス'
これでメール認証の設定は完了です。
届くメールの内容を編集しよう
メール認証機能を実装するとユーザー登録やパスワードを変更する時にメールを送ることができるようになります。
デフォルトだとdeviseが作成した英語の内容になっているので、自分のアプリに応じて内容を差し替えます。
編集するファイルは「app/views/devise/mailer」の中にあるファイルです。
各ファイルがどの時に送られるメールなのかを確認してみましょう。
ファイル名 | 送られる時 |
---|---|
confirmation_instructions.html.erb | ユーザー登録をした時 |
password_change.html.erb | パスワード変更が完了した時 |
reset_password_instructions.html.erb | パスワードを忘れた時 |
unlock_instructions.html.erb | アカウントがロックされた時 |
deviseは認証機能を簡単に実装できるとても便利なGemです。