在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.pswp.cn/bicheng/79844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79844.shtml
英文地址,請注明出處:http://en.pswp.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應用的性能監控體系,包括監控指標的設計、數據采集實現、分析平臺搭建等內容。 …