2019年09月10日 17:58
以前ユーザがログインした履歴をデータベースに保存する方法を紹介しましたが、独自のテーブルを作らなくてもセッションをデータベースに保存する方法があったのでそちらを紹介します。
またその方法だと、記事内で課題となっていた以下の点が解消されています。
またログインするたびに新しく記録されるので、データが膨大になる可能性があります。
Google やその他アクセス管理をしている Web では同一のデバイスであれば記録を上書きするようにできているのですが、どうやって実装すれば良いのか悩みどころです(セッションだとログアウトのたびに再生成されてしまうので)。
Laravel
ではデフォルトではセッションをファイルに保存しているのですが、config/session.php
を編集し、テーブルを用意することでセッションをデータベースに記録することができます。
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'databese'),
公式のドキュメントではconfig/session.php
を編集し、以下のコマンドで
sessions テーブルを生成することで可能だと表記しています。
php artisan session:table
php artisan migrate
私の環境ではそれでは上手く行かなかったので以下のサイトを参考にしたところ.env
にも同様に
driver
を設定する項目があり、こちらをdatabase
に指定することでユーザがログインするたびに記録されるようになりました。
SESSION_DRIVER=database
設定を変更し、テーブルを作成後ユーザでログインすると以下の項目が自動的に追加されていきます。
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->unique();
$table->unsignedBigInteger('user_id')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity');
});
ip_address
やuser_agent
は内容的には前回と同じもので、last_activity
はユーザが最後にログインした
UNIX 時間で記録されます。
ユーザがログアウトするとuser_id
がnull
になるだけであり、削除はされません。再度同じユーザが同じデバイスからログインすると、再びuser_id
がセットされます。
このテーブルのおかげで、ログインするたびに項目が追加されてしまうという問題と、同一デバイスを判断できないという問題が解決されました。
また IP アドレスから地域の特定や、ユーザーエージェントが分かりにくいという問題については API やライブラリが存在するので、バックエンド・フロントエンドのどちらかで対応できます。
ユーザにログイン履歴を表示するためにはuser_id
がログインしているユーザのものと一致している項目を引っ張ってくる必要があります。
ドキュメントで紹介されている Session ファサードは Eloquent ではないようなので、通常の Eloquent で呼び出す方法は使えないようでした。そのため別途用意します。
php artisan make:Model Session
呼び出す時はデフォルトで用意されている Session
ファサードではないことをはっきりさせるため\App\Session
と明記します。
\App\Session::where('user_id', \Auth::user()->id)
->get();
Model を作成しない場合 SQL で呼び出します。
$sessions = \DB::table('sessions')
->where('user_id', '=', \Auth::user()->id)
->get();
ユーザのログイン履歴を取得する場合はセッションをデータベースに記録するように指定することで可能であることが分かりました。
大体やりたいことは載っているのでドキュメントをちゃんと読みましょう。
p { margin-bottom: 1em; } blockquote p { margin-bottom: initial; } #content ul { padding-left: 40px; } .token.operator { background-color: initial; }