hoge

いわゆるWeb Developerの備忘録

Laravelでセッションをデータベースに記録する

以前ユーザがログインした履歴をデータベースに保存する方法を紹介しましたが、独自のテーブルを作らなくてもセッションをデータベースに保存する方法があったのでそちらを紹介します。

またその方法だと、記事内で課題となっていた以下の点が解消されています。

またログインするたびに新しく記録されるので、データが膨大になる可能性があります。

Google やその他アクセス管理をしている Web では同一のデバイスであれば記録を上書きするようにできているのですが、どうやって実装すれば良いのか悩みどころです(セッションだとログアウトのたびに再生成されてしまうので)。

セッションをデータベースに保存する

Laravel ではデフォルトではセッションをファイルに保存しているのですが、config/session.phpを編集し、テーブルを用意することでセッションをデータベースに記録することができます。

HTTP セッション 5.8 Laravel

/*
|--------------------------------------------------------------------------
| 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

Laravel のセッション管理をデータベースに変更

設定を変更し、テーブルを作成後ユーザでログインすると以下の項目が自動的に追加されていきます。

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_addressuser_agentは内容的には前回と同じもので、last_activityはユーザが最後にログインした UNIX 時間で記録されます。

ユーザがログアウトするとuser_idnullになるだけであり、削除はされません。再度同じユーザが同じデバイスからログインすると、再びuser_idがセットされます。

このテーブルのおかげで、ログインするたびに項目が追加されてしまうという問題と、同一デバイスを判断できないという問題が解決されました。

また IP アドレスから地域の特定や、ユーザーエージェントが分かりにくいという問題については API やライブラリが存在するので、バックエンド・フロントエンドのどちらかで対応できます。

ユーザごとのログイン履歴を取得する

ユーザにログイン履歴を表示するためにはuser_idがログインしているユーザのものと一致している項目を引っ張ってくる必要があります。

方法 1

ドキュメントで紹介されている Session ファサードは Eloquent ではないようなので、通常の Eloquent で呼び出す方法は使えないようでした。そのため別途用意します。

php artisan make:Model Session

呼び出す時はデフォルトで用意されている Session ファサードではないことをはっきりさせるため\App\Sessionと明記します。

\App\Session::where('user_id', \Auth::user()->id)
    ->get();

方法 2

Model を作成しない場合 SQL で呼び出します。

$sessions =  \DB::table('sessions')
    ->where('user_id', '=', \Auth::user()->id)
    ->get();

まとめ

ユーザのログイン履歴を取得する場合はセッションをデータベースに記録するように指定することで可能であることが分かりました。

大体やりたいことは載っているのでドキュメントをちゃんと読みましょう。


同じカテゴリー(PHP)の記事
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
Laravelでセッションをデータベースに記録する
    コメント(0)