php - 如何记录所有网络交易 (PHP/Laravel)

标签 php mysql laravel-5 audit

我正在用 PHP/MySQl(使用 Laravel 5.2 框架)开发一个安全的应用程序,以下是我的要求

  1. 我需要记录应用程序发生的所有事务,例如谁登录了,他做了什么操作。如果他打开任何报告,他打开了什么报告,他看到了什么数据,他看到的那些记录是什么?

  2. 这基本上是为了审计目的,所以我应该能够将数据存储在数据库中并按需提供给审计团队

请让我知道是否有任何现有插件可以支持此要求或建议我构建此要求的最佳方法?

提前致谢!

最佳答案

记录器

最简单快速的方法是使用 Laravel 提供的开箱即用的记录器。

您可以通过添加一行类似于以下的代码来跟踪用户:

Log::info('Showing user profile for user: '.$id);

$id 在哪里

$user = Auth::user();

或者干脆创建一个静态方法以在您的应用程序中重用:

public static function trackUser($message){
  $user = Auth::user();
  Log::info('Showing user profile for user: '.$user->id);
}

根据需要扩展它以添加更多数据。

有关 Laravel 记录器的更多信息,请访问:

https://laravel.com/docs/5.2/errors#logging

事件日志/修订

如果您还想跟踪系统中的实体,您可能还需要考虑类似事件日志的内容:

我用过这个库:https://github.com/VentureCraft/revisionable过去它对我的目的很有效。

每次修改、创建或删除实体时,它都会在修订表中插入一条记录,其中包含先前值和新值的序列化值。

您将需要设置您的实体。这是我如何在实体上设置它的示例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Sofa\Revisionable\Laravel\RevisionableTrait;
use Sofa\Revisionable\Revisionable;

class Invoice extends Model implements Revisionable {
    use RevisionableTrait;

    protected $table = 'invoices';
    protected $fillable = ['po_id', 'file_name', 'charges', 'customer', 'company', 'notes', 'tax', 'created_by'];
    protected $revisionPresenter = 'App\Presenters\InvoicePresenter';

    public function po()
    {
        return $this->belongsTo('App\PO');
    }

    public function transactions()
    {
        return $this->hasMany('App\Transaction');
    }
}

之后,您将能够跟踪实体上的更改,而无需在代码中执行任何额外操作。

事件溯源

事件溯源会给您的应用程序带来很多复杂性,但它会解决很多问题。通过实现此模式,您不仅可以记录用户在您的系统中所做的事情,还可以随着时间的推移跟踪每个实体。这是通过仅在事件发生时存储事件并通过运行所有事件重新创建实体来实现的。这会影响性能,但可以通过将此模式与物化 View 模式相结合来解决。这可以为您的应用程序添加最终一致性。

请确保使用此模式确实有值(value),否则您(和您的团队)将感受到复杂性带来的痛苦

关于php - 如何记录所有网络交易 (PHP/Laravel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902496/

相关文章:

php - SQLite 没有 DATE 数据类型?我该如何解决这个问题?

php - Eloquent hasOne 关系即使存在相关记录也返回 NULL

javascript - 如何使用后端发送的json数据

php - 使用 ajax php 和 mysql 自动完成

php - 错误:RecaptchaField::validate():Recaptcha 服务错误: 'invalid-request-cookie'

MYSQL - 使用 IN 子句检索金额

php - 构建 MySQL 表,其中 PLAYLIST 表引用多个 VIDEO id 整数和 USER 表 id

php - 我应该将我的 Laravel 4 应用程序更新到 Laravel 5 还是创建一个新的 Laravel 5 应用程序

php - Mysqli语句的 `close()`方法是什么?

javascript - HTML 选择表单 - 如何触发 "dynamically generated option"