🐳

Laravel Auditingで始めるデータ監査:不正やミスを簡単に追跡できるようにする方法

2024/03/22に公開

はじめに

こんにちは、Kouです。

早速ですが、今回はLaravelで複数のアカウント管理をしている場合、行動に誤りがあった場合など、 原因特定と作業者の特定を行う必要があった為、「Laravel Auditing」というパッケージを利用した記録を残します。

前回は「Google SpreadSheetに登録したデータをウェブサイトに表示する方法」を投稿しました。

概要

Laravel Auditing パッケージを利用して、レコードの作成、変更、削除や属性の変更など、 モデル内で発生するすべての変更を追跡(ログ取り)できるようにした手順です。

変更前と変更後のデータも持つので、履歴管理としても使えそうです。

カスタマイズ要件として、ログインしているユーザの情報を一部変えて監査データを作成しました。

基本的にドキュメントが整理されているので、他の必要な情報は公式のガイドを見ていただければればと思います😅

https://laravel-auditing.com/

インストール

Composer経由でインストールする必要があります。

composer require owen-it/laravel-auditing

※ sail環境

sail composer require owen-it/laravel-auditing

サービス プロバイダーを登録

config/app.php
    'providers' => [
        // ...
        
        /*  
         * Package Service Providers...
         */
         
        // ...

+       OwenIt\Auditing\AuditingServiceProvider::class,
        
        // ...

構成ファイルの作成

php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"

※ sail環境

sail artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"

config/audit.php が作成される。

サービスの有効化/無効化の設定

envを利用して、環境により設定の変更ができる。

config/audit.php
'enabled' => env('AUDITING_ENABLED', true),
.env
AUDITING_ENABLED=true #falseで無効

データベースの用意

次のコマンドで、auditsテーブルの定義が作成される。

php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"

※ sail環境

sail artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"

マイグレーション

必要に応じて定義をカスタマイズし、テーブルの作成をする。

php artisan migrate

※ sail環境

sail artisan migrate

監査対象のモデルをセットアップ

例としてUserモデルの監査を行う

app\Models\User.php
<?php

namespace App\Models;

// ...

+use OwenIt\Auditing\Contracts\Auditable;

-class User extends Model
+class User extends Model implements Auditable
{

+    use \OwenIt\Auditing\Auditable;

必要に応じて、他のモデルへ同様の修正を行う。

結果のサンプル

修正を行ったモデルを使用して、実際にレコードの作成、変更、削除を行った結果を示します。

id user_type user_id event auditable_type auditable_id old_values new_values url ip_address user_agent tags created_at updated_at
1 App\Models\User 1 created App\Models\Xxxx 1 [] {"id":1,"data":"xxx"} xxx xxx xxx xxx xxx xxx
2 App\Models\User 1 deleted App\Models\Xxxx 1 {"id":1,"data":"xxx"} [] xxx xxx xxx xxx xxx xxx

カスタマイズ

  • auditsテーブルに項目を追加したい場合は、新しいリゾルバーを作成し、構成ファイルのresolvers配列に追加するだけです。

php artisan auditing:audit-resolver CustomUserResolver

※ sail環境

sail artisan auditing:audit-resolver CustomUserResolver

app/AuditResolvers/CustomUserResolver.php
<?php

namespace App\AuditResolvers;

use OwenIt\Auditing\Contracts\Auditable;
use OwenIt\Auditing\Contracts\Resolver;

class CustomUserResolver implements Resolver
{
    public static function resolve(Auditable $auditable)
    {
        /*
         * ここに追加した項目に入れる処理を書く
         */
    }
}

構成ファイルで作成したCustomUserResolverを設定する。

config/audit.php
    'resolvers' => [
        'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class,
        'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class,
        'url'        => OwenIt\Auditing\Resolvers\UrlResolver::class,
+        'custom_user' => App\AuditResolvers\CustomUserResolver::class,
    ],

おわりに

簡単にモデルを使用して監査レコードを取得することができるため、
現在はログを残すだけの運用を行っていますが、将来的には画面を作成してみることも検討しています。

GitHubで編集を提案
CareNet Engineers

Discussion