やりたかったこと
ユーザーのログイン頻度を知りたい
前提
Rails 5.2.2
Devise 4.5.0
OS macOS Sierra
ブラウザ chrome 74
Deviseを利用しているモデルはUserモデル
この記事で書いてること
やりたかったことをやるためにはdeviseの仕様について理解する必要があり、そのために行った調査の結果を書いてる
調べた結果
Railsのデフォルトの設定だと、できないケースがある。
調べたこと
ログイン状態を維持する機能
deviseのrememberableモジュールでできる。デフォルトで利用する状態になっている。
セッションが切れても、クッキーとトークンを使ってログイン状態を維持できる。もっとわかりやすい言葉で言うと、ブラウザを閉じて再度サイトに訪れてもログインされたままにする機能。
利用中かどうかの確認
User.rbのdeviseメソッド(メソッドというかはわからない)に :rememberableがあるかどうか。
devise :rememberable
ログイン状態を維持する期間について
デフォルトでは2週間。
最後に接続してからの期間ではなく、最後にログイン認証を行ってからの期間。
devise.rbの下記の行で設定することが可能。devise.rbをいじっていなければ、コメントアウトされているのでコメントアウトを外して変更すれば、任意の期間を設定可能。
config.remember_for = 2.weeks
rememberableの具体的な動き
主にUser.remember_created_atを利用する。remember_created_atから設定の期間が経つとログインを促される。
sign_inページでログイン状態を維持する(Remember me)にチェックを入れてログインをすると、remember_created_atに時間が入る。チェックを入れずにログインしたり、ログアウトしたりすると、remember_created_atはnilになる
sign_in_countやcurrent_sign_in_atの動き
sign_in_countやcurrent_sign_in_atなどは、そもそもはtrackableモジュールの機能
ログイン情報を維持しない場合、ログインするときにカウントアップされ、current_sign_in_atが更新される。ログインしている状態でログイン必須ページにアクセスしたりしてもこれらのカラムは更新されない。
ログイン情報を維持する場合、セッションが切れた(Macでブラウザを完全終了した)後に接続されるとカウントアップされ、current_sign_in_atも更新される。
Mac特有の動き?
Macにはアプリケーションを閉じるだけ(左上の×ボタン)と完全終了(command + q)の2つが存在する。セッションが切れるタイミングは完全終了したとき。
Windowsは未確認。記憶の限りで推測すると、右上の×ボタンでブラウザを閉じるとセッションが切れる。
スマホの場合も未確認。通常のログインがどんなタイミングで維持できなくなるかを確認すればわかる。
自動ログアウト機能
この名前が正しいかは不明。今回はもともと利用していなかったので、動作確認レベルでの仕様確認をしていない。ドキュメントを読んだりした内容で記述。
この機能について
ログイン後でも、画面を開きっぱなしにして、再度画面を動かすとログインを促されることがあると思うが、それを実現する機能。
利用中かどうか
User.rbのdeviseメソッド(メソッドというかはわからない)に :timeoutableがあるかどうか。
再度ログインをするまでの時間
デフォルトは30分。設定はrememberableと同様にdevise.rbにコメントアウトされている。下記の行で設定可能。
config.timeout_in = 30.minutes
sign_in_countやcurrent_sign_in_atの動き
ログアウトさせる機能なので、基本的な動きと一緒。
Railsのセッション保持期間との兼ね合い
Railsのセッションの保持については、config/initializers/session_store.rb
Rails.application.config.session_store
に設定がある。
おそらく、expires_after > timeoutable にすれば問題ない。
rememberableとtimeoutableの違い
timeoutableはセッションを切るもの = ログアウトさせるもの
rememberableはセッションを新たに作るもの = セッションが切れた後の接続時にcookie情報とトークンによりログインしてくれるもの
個人情報を多く含む管理画面などでは、rememberableは利用できないよう(セッションが切れたら毎回ログイン情報を入力)にして、timeoutableをできるだけ短くするのがいいと思う。
ログイン頻度を計測するには、、、
厳密に行うためには下記のいずれかの対応を行う必要がある。
- deviseを拡張する
- devise以外の部分でページアクセス時に更新されるデータを確認する
- timeoutableの設定をする。
大雑把でよければ、sign_in_countやcurrent_sign_in_at, last_sign_in_atを利用すれば可能。ただ、ある時点の状態から差し引くなどの対応が必要。
コメントを残す