Laravel Auditing에서 데이터베이스 변경 모니터링

'누가 언제 데이터를 조작했는지 알고 싶다'는 데이터를 감시해야 할 때 Laravel Auditing 편리하다.

개요


Laravel Auditing은 데이터베이스에 지정된 감시된 표를 추가, 업데이트, 삭제 등 변경할 때 누가 어떤 변경을 했는지 자동으로 기록하는 소프트웨어 패키지입니다.

설치 및 구성


설치


composer에서 진행합니다.
composer require owen-it/laravel-auditing

프로비저닝


설치 후 공급업체를 추가합니다config/app.php.
config/app.php
'providers' => [
+    OwenIt\Auditing\AuditingServiceProvider::class,
],
추가한 후 다음 명령을 실행하여 Laravel Auditing에 사용할 프로필을 만듭니다.
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="config"
실행할 때 config/audit.php 라는 파일이 생성됩니다.별도의 사용자 정의가 필요하지 않으면 다음 명령으로 데이터베이스의 마이그레이션 파일을 만듭니다.
php artisan vendor:publish --provider "OwenIt\Auditing\AuditingServiceProvider" --tag="migrations"
실행 후,audits 테이블을 만들기 위한 database/migrations/yyyy_mm_dd_nnnnnn_create_audits_table.php 파일을 만듭니다.audits 테이블을 만들기 위해 만든 후 이식합니다.
php artisan migrate

감시하다


기본 설정


설정이 완료되면 감시하고 싶은 데이터 모델에 추적합니다.예를 들어items표 데이터를 감시하고 싶은 상황에서
app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
+ use OwenIt\Auditing\Contracts\Auditable;
+
+ class Item extends Model implements Auditable
- class Item extends Model
{

+    use \OwenIt\Auditing\Auditable;

좀 복잡하지만 인터페이스는 OwenIt\Auditing\Contracts\Auditable, trait는 \OwenIt\Auditing\Auditable로 지정됩니다.이것만 추적하면 감시 대상이 된다.

실제 감시


그럼, 이 시계에 대해 새로운 로그인, 변경, 삭제를 진행합시다.이 동작을 실행하면audits 테이블에 다음 데이터를 추가합니다.
id
user_type
user_id
event
auditable_type
auditable_id
old_values
new_values
url
ip_address
user_agent
tags
created_at
updated_at

NULL
NULL
updated
App\Item

{"name":"\u8ffd\u52a01"}
{"name":"\u8ffd\u52a02"}
http://localhost:8000/items/2
127.0.0.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15
NULL
2020-03-23 12:20:34
2020-03-23 12:20:34

App\User

created
App\Item

[]
{"name":"\u307b\u3052","stock":"10","id":3}
http://localhost:8000/items
127.0.0.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15
NULL
2020-03-23 12:21:39
2020-03-23 12:21:39

App\User

deleted
App\Item

{"id":"3","name":"\u307b\u3052","stock":"10"}
[]
http://localhost:8000/items/3
127.0.0.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15
NULL
2020-03-23 12:51:57
2020-03-23 12:51:57
감시 대상의 데이터는 다음과 같은 내용을 축적했다.
필드 이름
컨텐츠 축적
id
데이터 모니터링 ID
user_type
사용자 모델의 클래스 이름
user_id
사용자 ID
event
실행 이벤트
auditable_type
업데이트된 데이터 모델의 클래스 이름
auditable_id
업데이트 데이터 식별
old_values
이전 데이터 업데이트
new_values
업데이트된 데이터
url
실행 URL
ip_address
IP 주소
user_agent
사용자 에이전트
tags
표식
created_at
작성 날짜 및 시간 (= 데이터 업데이트 날짜 및 시간)
updated_at
업데이트 시간
많이 생각하지 않지만 로그인하지 않고 데이터를 업데이트하면 user_type, user_id 비어 있습니다.

모니터링 데이터 가져오기


감시 데이터는 감시 대상의 모델과 관련이 있다.
<?php

$item = Item::find(1);

// 該当データの全ての監視データ
$audits = $item->audits;

// 該当データの最初の監視データ
$first = $item->audits()->first();

// 該当データの直近の監視データ
$latest = $item->audits()->latest()->first();

// 該当データの監視データのID指定
$audit = $item->audits()->find(1);
모니터링 데이터도 Eloquent 모델로 직접 얻을 수 있습니다.
<?php

use OwenIt\Auditing\Models\Audit;

// 全件取得
$audits = Audit::all();

// ID指定
$audit = Audit::find(1);

사용자 정의


콘솔 명령 실행 모니터링


기본적으로 콘솔 명령과 작업 업데이트는 감시되지 않습니다.모니터링하려면 config/audit.php 에서 설정을 변경합니다.
config/audit.php
-    'console' => false,
+    'console' => true,

모니터링 필드 축소


기본적으로 등록 및 업데이트 날짜 및 시간은 적용되지 않습니다.모니터링 필드를 축소하려면 모니터링 개체 모델에 추가로 설정합니다.
app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditInclude = [
+        'name',
+    ];
반대로 배제하려면 $auditExclude 로 지정하여 제외할 수 있다.

축적된 데이터를 바꾸고 싶어요.


저장할 데이터를 사용자 정의하려면 자원을 만듭니다.Laravel Auditing은 다음과 같은 Resolver 인터페이스를 제공합니다.
인터페이스
개요
OwenIt\Auditing\Contracts\IpAddressResolver
IP 주소용 I/F
OwenIt\Auditing\Contracts\UrlResolver
URL용 I/F
OwenIt\Auditing\Contracts\UserAgentResolver
사용자 에이전트용 I/F
OwenIt\Auditing\Contracts\UserResolver
사용자 모델용 I/F
이를 통해 축적된 데이터를 바꿀 수 있다.
app/resolvers/IpAddressResolver.php

<?php
namespace App\Resolvers;

use Illuminate\Support\Facades\Request;

class IpAddressResolver implements \OwenIt\Auditing\Contracts\IpAddressResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve(): string
    {
        return Request::header('HTTP_X_FORWARDED_FOR', '0.0.0.0');
    }
}
config/audit.php에 자체 Resolver를 설정하여 반영합니다.
config/audit.php
return [
    'resolver' = [
        'user'       => OwenIt\Auditing\Resolvers\UserResolver::class,
-        'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class,
+        'ip_address' => App\Resolvers\IpAddressResolver::class,
        'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class,
        'url'        => OwenIt\Auditing\Resolvers\UrlResolver::class,
    ],
];

마스크 쓰고 싶어요.


모니터링 데이터는 변경 전, 후의 값을 그대로 저장하지만 때로는 마스크 저장을 원할 수도 있습니다.이 경우 모니터링할 모델로 설정하여 마스크를 사용할 수 있습니다.
app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;
+use OwenIt\Auditing\Redactors\LeftRedactor;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $attributeModifiers = [
+        'title' => LeftRedactor::class,
+    ];
LeftRedactor 왼쪽에서 오른쪽 마스크 90%, 나머지 10%는 원형으로, RightRedactor 오른쪽에서 오른쪽 마스크 90%.마스크 섹션은 ##### 로 저장됩니다.

특정한 사건만 감시하고 싶어요.


기본적으로 추가, 업데이트 및 삭제를 모니터링하지만 설정을 통해 이벤트 범위를 좁힐 수 있습니다.예를 들어, 삭제만 모니터링하려면 다음과 같이 설정합니다.

총체적


config/audit.php
    'events' => [
-        'created',
-        'updated',
        'deleted',
-        'restored',
    ],

특정 모니터링만


app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditEvents = [
+        'deleted',
+    ];

모니터링 로그 상한선 설정


기본적으로 모니터링 로그는 계속 누적됩니다.상한선을 설정하려면 다음과 같은 설정을 통해 상한선을 초과한 오래된 데이터를 삭제합니다.

총체적


config/audit.php
-    'threshold' => 0, // 0だと上限なし
+    'threshold' => 10,

특정 모니터링만


app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable;

class Item extends Model implements Auditable
{
    use \OwenIt\Auditing\Auditable;


+    protected $auditThreshold = 10;

좋은 웹페이지 즐겨찾기