更新日:
【Rails】 deviseの使い方とは?ログイン認証機能を実装しよう
deviseとは、railsのgemの一つでログイン認証機能を簡単に実装することができます。
deviseのインストール方法
この章では、ログイン認証についてとdeviseのインストール方法について1つ1つ丁寧に解説します。
ログイン認証ってなに?
ログイン認証とは簡単にいうとログイン、ログアウト機能のことです。
ログインするにはまずサインアップ(新規登録)をする必要があるので、ユーザー登録も必要になります。
これを自分で実装しようとすると非常に大変です。
ですが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の基本的な使い方
この章では、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で定義されたモジュールの設定が書かれています。
それぞれのモジュールがどういう機能を持つのか確認しておきましょう。
DatabaseAuthenticatable
データベースに保存されたパスワードが正しいか検証をします。
同時にパスワードの暗号化も行います。
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.rb
に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の応用的な使い方
この章では、deviseの応用的な使い方について解説します。
deviseを日本語化しよう
デフォルト状態だとフラッシュメッセージなどが英語なので日本語に変更しましょう。
公式サイトにもやり方が載っています。
まずはconfig/application.rb
に下記のコードを追記します。
1
config.i18n.default_locale = :ja
次にconfig/locales
フォルダ内にdevise.ja.yml
というファイルを作成します。
作成したファイルにこちらに掲載されている内容をコピーします。
もう一つconfig/locales
フォルダ内にja.yml
というファイルを作成します。
作成したファイルにこちらに掲載されている内容をコピーします。
これで日本語化は完了です。
I18nについて詳しく知りたい方は、こちらの「I18n入門書」を参照してください。
ビューを変更しよう
投稿フォームのデザインは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段階認証プロセスがオンになっているのを確認し、アプリパスワードをクリックする。
- 本人認証後、下の画面になるので、「その他(名前を入力)」を選択し、自分のアプリ名を入力する。
- アプリパスワードが生成されるので、コピーをする。
これでアプリ生成パスワードが確認できました。
このパスワードを上の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 | アカウントがロックされた時 |
やや難易度は上がりますが、こちらの参考書ではPikawakaのログイン機能のようにOAuthを利用してGitHubでログイン機能が作れます。気になる方は挑戦してみましょう!
この記事のまとめ
- deviseは認証機能を簡単に実装できるとても便利なGem
- ログイン認証とは簡単にいうとログイン、ログアウト機能のこと
- 認証モデルは、通常のモデル作成コマンドではなく、
rails g devise モデル名
を実行する