こんにちは!kossyです!
さて、今回は認証機能を提供するGem「devise」のextensionで、エンタープライズな認証機能を実現する
devise-securityのsession_limitableを使ってみたので、備忘録としてブログに残してみたいと思います。
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でログイン
その後safariでログイン
その後chromeの方をリロードすると、ログアウト画面に遷移する(sessionが切れている)
動作の確認が取れました。
まとめ
動作確認していて思ったのですが、複数環境でのログインそのものはできるんですね。セッションが生きている状態でログインを試みたら、ログインに失敗する機能かと勘違いしていました。
session_limitableを検索すると、「多重ログイン」という文言が出てくるのですが、
本ブログでは「多重セッション」という言葉を選んでいます。多重ログイン自体は可能のようだからですね。
あと、unique_session_idの更新時にupdated_atの値が更新されていないようでした。
Railsの場合、レコードに変更が加わると自動でupdated_atが更新されるんですが、なぜ更新がされていないのか、原因を追ってみたくなりました。