2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】Deviseでログイン状態を保持する方法(rememberable)

2
Posted at

はじめに

個人開発の中で学んだことを備忘録としてまとめます。
※間違いがありましたらご教授お願い致します!

開発中のアプリを実際に自分で使ってみて思いました。

開くたびにメールアドレスとパスワードを入力してログインするのめんどくさい。

日常的に使うアプリにしたかったので、そこまで厳重なセキュリティよりも

アプリを開いたらパッと使える体験を

重視したいと考えました。

そこで今回一度ログインしたら、その状態がしばらく保持されるように
Deviseのrememberable機能を実装しました。

やりたいこと

  • ログイン状態を保持したい
  • 次回アクセス時もログイン状態を維持したい

開発環境

Ruby on Rails 7.1.6
Devise導入済み

実装方法

rememberableの有効化

rememberableとはDeviseを導入すれば使用することができる
ログインを保持する機能です。
この機能が有効になっているかを確認します。

users.rb
devise :database_authenticatable, :registerable, :rememberable など

:rememberableがなかった場合は追加します。

カラムがあるか確認

db/schema.rb
t.datetime "remember_created_at"

なければマイグレーションを作成して追加します。

自動ログインの実装

ログイン状態を保持するためには、ログイン時に remember_me を true にする必要があります。

sessions_controllorer
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/initializers/devise.rb
# config.remember_for = 2.weeks

このようにコメントアウトの中にデフォルトの設定が入っています。
ここを変更すれば保持期間を自分で設定することができます。

まとめ

  • rememberable は「機能を有効化するだけ」
  • 実際にログインを保持するには remember_me = true が必要
  • super do |resource| を使うことでログイン後の処理をカスタマイズできる
  • cookieを使ってログイン状態を保持している

今回実装後にスマホで確認してみたところ、ログイン状態が保持されませんでした。
理由はプライベートモードで開いていたためcookieが消えてしまっていたからでした。
通常モードで開く必要があるようです。

補足

Deviseには今回使用した rememberable 以外にも、様々な機能が用意されています。

例えば以下のようなものがあります

:confirmable → メール認証機能
:lockable → ログイン試行回数制限
:timeoutable → 一定時間で自動ログアウト
:trackable → ログイン履歴の記録

Deviseとても便利ですね!:laughing:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?