devise-securityのsession_limitableを使ってみる

こんにちは!kossyです!




さて、今回は認証機能を提供するGem「devise」のextensionで、エンタープライズな認証機能を実現する

devise-securityのsession_limitableを使ってみたので、備忘録としてブログに残してみたいと思います。



環境

Ruby 2.6.8
Rails 6.0.4
MacOS BigSur
devise-security 0.16.1



session_limitableとは?

1アカウント1セッションであることを強制する、いわゆる「多重セッション」を禁止するモジュールです。

多重セッションの禁止とは、例えばスマホTwitterにログインした状態でPCからTwitterにログインすると、スマホ側のTwitterのセッションが切れることを指します。

導入

既にdeviseの導入とdeviseの各種モジュールをincludeしたモデル(User)が定義されているものとします。

Gemfileにdevise-securiyを追加

gem 'devise-security'

でbundle

$ bundle

Userモデルにsession_limitableモジュールで使うカラムを追加します。

class AddUniqueSessionIdToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :unique_session_id, :string
  end
end

rails db:migrate

$ rails db:migrate

次にUserモデルにsession_limitableモジュールを追加します。

devise :session_limitable

これで導入は完了です。


動作確認

複数ブラウザを立ち上げて動作を確認してみます。

chromeでログイン

f:id:kossy-web-engineer:20211128232921p:plain

その後safariでログイン

f:id:kossy-web-engineer:20211128233024p:plain

その後chromeの方をリロードすると、ログアウト画面に遷移する(sessionが切れている)

f:id:kossy-web-engineer:20211128233058p:plain



動作の確認が取れました。

まとめ

動作確認していて思ったのですが、複数環境でのログインそのものはできるんですね。セッションが生きている状態でログインを試みたら、ログインに失敗する機能かと勘違いしていました。

session_limitableを検索すると、「多重ログイン」という文言が出てくるのですが、

本ブログでは「多重セッション」という言葉を選んでいます。多重ログイン自体は可能のようだからですね。

あと、unique_session_idの更新時にupdated_atの値が更新されていないようでした。

Railsの場合、レコードに変更が加わると自動でupdated_atが更新されるんですが、なぜ更新がされていないのか、原因を追ってみたくなりました。