はじめに
個人開発の中で学んだことを備忘録としてまとめます。
※間違いがありましたらご教授お願い致します!
開発中のアプリを実際に自分で使ってみて思いました。
開くたびにメールアドレスとパスワードを入力してログインするのめんどくさい。
日常的に使うアプリにしたかったので、そこまで厳重なセキュリティよりも
アプリを開いたらパッと使える体験を
重視したいと考えました。
そこで今回一度ログインしたら、その状態がしばらく保持されるように
Deviseのrememberable機能を実装しました。
やりたいこと
- ログイン状態を保持したい
- 次回アクセス時もログイン状態を維持したい
開発環境
Ruby on Rails 7.1.6
Devise導入済み
実装方法
rememberableの有効化
rememberableとはDeviseを導入すれば使用することができる
ログインを保持する機能です。
この機能が有効になっているかを確認します。
devise :database_authenticatable, :registerable, :rememberable など
:rememberableがなかった場合は追加します。
カラムがあるか確認
t.datetime "remember_created_at"
なければマイグレーションを作成して追加します。
自動ログインの実装
ログイン状態を保持するためには、ログイン時に remember_me を true にする必要があります。
class Users::SessionsController < Devise::SessionsController
def create
super do |resource|
resource.remember_me = true
end
end
end
ここの部分が何をしているのか分かりませんでしたので、以下調べてわかったことになります。
super とは
super は親クラス(Deviseの SessionsController)の create メソッドを呼び出しています。
つまり、以下の処理を実行しています。
- メールアドレス・パスワードの認証
- ログイン処理
- セッションの作成
ブロック付きsuper
super do |resource|
このようにブロック付きで書くことで
ログインしたユーザーの情報を受け取り、追加処理を実行することができます。
resourceって何
resourceは定義しなくてもDeviseが用意してくれいている物です。
ログインしているユーザーのオブジェクトを表しています。
resource ≒ current_user(ログイン直後)とほぼ同じ考えると分かりやすいです。
これでログイン直後 remember_me = true が実行されます。
remember_me = trueの役割
- cookieにログイン情報が保存される
- 次回アクセス時に自動ログインされる
rememberable を有効にしていても、
resource.remember_me = true
がないとログイン状態は保持されません。
これは、Deviseが「チェックボックスでユーザーが選択した場合のみ保持する」という仕様のためです。
ログイン保持期間の設定
デフォルトでは2週間の保持期間になっています。
# config.remember_for = 2.weeks
このようにコメントアウトの中にデフォルトの設定が入っています。
ここを変更すれば保持期間を自分で設定することができます。
まとめ
- rememberable は「機能を有効化するだけ」
- 実際にログインを保持するには remember_me = true が必要
- super do |resource| を使うことでログイン後の処理をカスタマイズできる
- cookieを使ってログイン状態を保持している
今回実装後にスマホで確認してみたところ、ログイン状態が保持されませんでした。
理由はプライベートモードで開いていたためcookieが消えてしまっていたからでした。
通常モードで開く必要があるようです。
補足
Deviseには今回使用した rememberable 以外にも、様々な機能が用意されています。
例えば以下のようなものがあります
:confirmable → メール認証機能
:lockable → ログイン試行回数制限
:timeoutable → 一定時間で自動ログアウト
:trackable → ログイン履歴の記録
Deviseとても便利ですね!![]()