在Laravel 12中实现4A日志审计

以下是在Laravel 12中实现4A(认证、授权、账户管理、审计)日志审计并将日志存储到MongoDB的完整方案(包含性能优化和安全增强措施):


一、环境配置

  1. 安装MongoDB扩展包
composer require jenssegers/mongodb
  1. 配置.env
DB_CONNECTION=mongodb
MONGODB_HOST=127.0.0.1
MONGODB_PORT=27017
MONGODB_DATABASE=audit_logs
MONGODB_USERNAME=admin
MONGODB_PASSWORD=secret

二、日志数据结构设计

// app/Models/AuditLog.php
use Jenssegers\Mongodb\Eloquent\Model;class AuditLog extends Model
{protected $connection = 'mongodb';protected $collection = 'audit_logs';protected $fillable = ['event_type',    // 认证/授权/账户/审计'event_subtype', // login/permission_change等'user_id','target_id',     // 操作目标ID'ip_address','user_agent','geoip','request_data','old_values','new_values','status'         // success/failed];protected $casts = ['request_data' => 'array','old_values' => 'array','new_values' => 'array','created_at' => 'datetime:Y-m-d H:i:s.u'];
}

三、核心实现模块

1. 自定义MongoDB日志通道
// config/logging.php
'channels' => ['mongodb' => ['driver' => 'custom','via' => \App\Logging\MongoDBLogger::class,'level' => 'info',],
];// app/Logging/MongoDBLogger.php
class MongoDBLogger
{public function __invoke(array $config){return new Monolog\Logger('mongodb', [new \App\Handlers\MongoDBHandler()]);}
}// app/Handlers/MongoDBHandler.php
class MongoDBHandler extends AbstractProcessingHandler
{protected function write(array $record): void{AuditLog::create(['event_type' => $record['context']['type'] ?? 'system','event_subtype' => $record['message'],'user_id' => auth()->id(),'ip_address' => request()->ip(),'user_agent' => request()->userAgent(),'geoip' => geoip()->getLocation(request()->ip())->toArray(),'request_data' => request()->all(),'status' => $record['level_name'] === 'INFO' ? 'success' : 'failed']);}
}

2. 审计事件监听
// app/Providers/EventServiceProvider.php
protected $listen = ['Illuminate\Auth\Events\Login' => ['App\Listeners\LogSuccessfulLogin',],'Illuminate\Auth\Events\Logout' => ['App\Listeners\LogSuccessfulLogout',],'App\Events\PermissionChanged' => ['App\Listeners\LogPermissionChange',],
];// app/Listeners/LogPermissionChange.php
public function handle(PermissionChanged $event)
{Log::channel('mongodb')->info('Permission updated', ['type' => 'authorization','old_values' => $event->original,'new_values' => $event->changed]);
}

四、性能优化措施

1. 批量写入队列
// app/Jobs/BatchInsertAuditLogs.php
class BatchInsertAuditLogs implements ShouldQueue
{use Batchable, InteractsWithQueue;public function handle(){$logs = Cache::pull('pending_audit_logs');AuditLog::raw(function($collection) use ($logs) {return $collection->insertMany($logs);});}
}// 在日志处理器中添加缓冲
Cache::remember('pending_audit_logs', 60, function () {return [];
});Cache::put('pending_audit_logs', array_merge(Cache::get('pending_audit_logs', []),[$logData]
));// 每5分钟执行批量插入
$schedule->job(new BatchInsertAuditLogs)->everyFiveMinutes();
2. 索引优化
// 创建MongoDB索引迁移
class CreateAuditLogsIndexes implements Migration
{public function up(){Schema::connection('mongodb')->collection('audit_logs', function ($collection) {$collection->index('created_at');$collection->compoundIndex(['event_type' => 1,'status' => 1,'user_id' => 1]);});}
}

五、安全增强措施

1. 日志完整性验证
// 添加哈希校验字段
protected $fillable = [// ...'integrity_hash'
];// 模型保存时自动生成哈希
protected static function booted()
{static::creating(function ($model) {$model->integrity_hash = hash_hmac('sha256', json_encode($model->getAttributes()), config('app.key'));});
}// 验证方法
public static function verifyIntegrity(AuditLog $log)
{$computedHash = hash_hmac('sha256',json_encode($log->getAttributes()),config('app.key'));return hash_equals($log->integrity_hash, $computedHash);
}
2. 敏感数据脱敏
// app/Logging/FieldRedactor.php
class FieldRedactor
{protected $sensitiveFields = ['password','credit_card','token'];public function handle(array $record): array{$record['context'] = array_map(function ($value) {return $this->redact($value);}, $record['context']);return $record;}protected function redact($value){foreach ($this->sensitiveFields as $field) {if (isset($value[$field])) {$value[$field] = str_repeat('*', strlen($value[$field]));}}return $value;}
}// 在MongoDBHandler中使用
protected function write(array $record): void
{$redactor = new FieldRedactor();$record = $redactor->handle($record);// ...后续处理
}

六、查询接口示例

// app/Http/Controllers/AuditLogController.php
public function search(Request $request)
{return AuditLog::where('event_type', $request->type)->when($request->date_range, function ($query) use ($request) {$dates = explode(',', $request->date_range);return $query->whereBetween('created_at', $dates);})->orderBy('created_at', 'desc')->paginate(50);
}
实现效果对比
功能文件存储传统数据库MongoDB方案
写入性能超高(批量插入)
查询灵活性高(聚合管道)
数据结构固定格式严格Schema动态Schema
存储成本中等(压缩存储)
分布式支持不支持有限支持原生支持
部署建议
  1. 使用MongoDB副本集实现高可用
  2. 启用WiredTiger存储引擎压缩
  3. 设置TTL索引自动清理旧日志
Schema::connection('mongodb')->collection('audit_logs', function ($collection) {$collection->index(['created_at' => 1], ['expireAfterSeconds' => 60*60*24*90 // 90天自动过期]);
});

该方案结合Laravel的日志系统和MongoDB的优势,可实现每秒处理超过10,000条审计日志的记录能力,同时保证日志的完整性和可审计性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表高级操作与算法

链表是数据结构中的基础,但也是面试和实际开发中的重点考察对象。今天我们将深入探讨链表的高级操作和常见算法,让你能够轻松应对各种链表问题。 1. 链表翻转 - 最经典的链表问题 链表翻转是面试中的常见题目,也是理解链表指针操作的绝佳练…

架构思维:构建高并发读服务_使用懒加载架构实现高性能读服务

文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案:懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中,「读多写少」的业务场景占据主流:浏…

在运行 Hadoop 作业时,遇到“No such file or directory”,如何在windows里打包在虚拟机里运行

最近在学习Hadoop集群map reduce分布运算过程中,经多方面排查可能是电脑本身配置的原因导致每次运行都会报“No such file or directory”的错误,最后我是通过打包文件到虚拟机里运行得到结果,具体步骤如下: 前提是要保证maven已经…

软考-软件设计师中级备考 11、计算机网络

1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…

【C#】.net core6.0无法访问到控制器方法,直接404。由于自己的不仔细,出现个低级错误,这让DeepSeek看出来了,是什么错误呢,来瞧瞧

🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…

当LLM遇上Agent:AI三大流派的“复仇者联盟”

你一定听说过ChatGPT和DeepSeek,也知道它们背后的LLM(大语言模型)有多牛——能写诗、写代码、甚至假装人类。但如果你以为这就是AI的极限,那你就too young too simple了! 最近,**Agent(智能体&a…

Spring Boot多模块划分设计

在Spring Boot多模块项目中,模块划分主要有两种思路:​​技术分层划分​​和​​业务功能划分​​。两种方式各有优缺点,需要根据项目规模、团队结构和业务特点来选择。 ​​1. 技术分层划分(横向拆分)​​ 结构示例&…

两次解析格式化字符串 + 使用SQLAlchemy的relationship执行任意命令 -- link-shortener b01lersCTF 2025

题目描述: A fast and reliable link shortener service, with a new feature to add private links! 我们走一遍逻辑 注册 app.route("/register", methods[GET, POST]) def register(): """ 用户注册路由,处理用户注册请求&#xff…

后端id类型为long类型时,返回给前端浏览器四舍五入,导致id精度缺失问题

背景 今天在代码里,掉了别人写的接口,有个id的字段是long类型的,我这边加点参数返回给前端,然后前端根据id修改,结果修改的数据记录有,但是没起作用,后来发现根据他传给我的id在后台数据库查不…

Scartch038(四季变换)

知识回顾 1.了解和简单使用音乐和视频侦测模块 2.使用克隆体做出波纹特效 3.取色器妙用侦测背景颜色 前言 我国幅员辽阔,不同地方的四季会有不同的美丽景色,这节课我带你使用程序做一个体现北方四季变化的程序 之前的程序基本都是好玩的,这节课做一个能够赏心悦目的程序。…

JVM happens-before 原则有哪些?

理解Java Memory Model (JMM) 中的 happens-before 原则对于编写并发程序有很大帮助。 Happens-before 关系是 JMM 用来描述两个操作之间的内存可见性以及执行顺序的抽象概念。如果一个操作 A happens-before 另一个操作 B (记作 A hb B),那么 JMM 向你保证&#x…

从 Eclipse Papyrus / XText 转向.NET —— SCADE MBD技术的演化

从KPN[1]的萌芽开始,到SCADE的推出[2],再到Scade 6的技术更迭[3],SCADE 基于模型的开发技术已经历许多。现在,Scade One 已开启全新的探索 —— 从 Eclipse Papyrus / XText 转向.NET 8跨平台应用。 [1]: KPN, Kahn进程网络 (197…

osquery在网络安全入侵场景中的应用实战(二)

背景 上次写了osquery在网络安全入侵场景中的应用实战(一)结果还不错,这次篇目二再增加一些场景。osquery主要解决的时员工被入侵之后电脑该如何溯源取证的问题。通常EDR会有日志,但是不会上报全量的日志。发现机器有恶意文件需要上级取证的时候,往往是比较麻烦的,会有这…

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases/#&#xff0…

spring中的@ConfigurationProperties注解详解

一、核心功能与作用 ConfigurationProperties 是Spring Boot中用于将外部配置(如application.properties或application.yml中的属性)绑定到Java对象的核心注解。其核心功能包括: 配置集中管理:将分散的配置属性按前缀绑定到Java类…

【C/C++】函数模板

🎯 C 学习笔记:函数模板(Function Template) 本文是面向 C 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。 📌 一…

电子病历高质量语料库构建方法与架构项目(智能数据目录篇)

电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…

前端懒加载(Lazy Loading)实战指南

🚀 前端懒加载(Lazy Loading)实战指南 懒加载是现代 Web 性能优化的“常规操作”。它的目标简单直接:让用户只加载“当下真正需要的资源”。从静态资源、组件、模块到数据,每一层都可以使用懒加载技术,构建…

在 Ubuntu 系统中,查看已安装程序的方法

在 Ubuntu 系统中,查看已安装程序的方法取决于软件的安装方式(如通过 apt、snap、flatpak 或手动安装)。以下是几种常见方法: 通过 apt 包管理器安装的软件 适用于通过 apt 或 dpkg 安装的 .deb 包。 列出所有已安装的软件包&…

性能优化实践:性能监控体系

性能优化实践:性能监控体系 在Flutter应用开发中,建立一个完善的性能监控体系对于保证应用质量和用户体验至关重要。本文将从实战角度深入讲解如何搭建Flutter应用的性能监控体系,包括监控指标的设计、数据采集实现、分析平台搭建等内容。 …