能否借助Doctrine与MariaDB Audit Plugin记录Laravel应用用户名?
MariaDB Audit Plugin本身无法直接记录Laravel应用层用户——它默认只会捕获数据库连接配置的用户(比如你的MyServerSideConfiguredMariaDBUser),但可以通过以下几种间接方案实现需求:
方案1:会话级自定义变量+审计日志格式扩展
在Laravel应用层给每个数据库会话注入应用用户变量,再配置Audit Plugin把这个变量写入日志:
Laravel端注入变量
编写一个全局中间件,在每个请求开始时(用户已认证后)执行会话变量设置:<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; class SetDatabaseAppUser { public function handle($request, Closure $next) { $user = Auth::user(); // 给当前数据库会话设置自定义变量,匿名用户设为'unknown' DB::statement("SET @app_user = ?", [$user?->name ?? 'unknown']); return $next($request); } }把这个中间件注册到
app/Http/Kernel.php的全局中间件组里,确保所有请求都会执行。MariaDB端配置Audit Plugin
修改MariaDB的配置文件(比如my.cnf),更新审计日志的输出字段,加入自定义变量:server_audit_events = CONNECT,QUERY,TABLE server_audit_output_fields = timestamp,user,host,db,@app_user,query,table重启MariaDB服务生效,之后审计日志里就会包含
@app_user字段,对应Laravel的当前登录用户。注意:如果用了数据库连接池或持久化连接,要确保每个请求都重置
@app_user,避免用户信息串用(上面的中间件每次请求都会执行,刚好解决这个问题)。
方案2:数据库连接属性传递
利用MariaDB支持的连接属性(Connection Attributes),在建立数据库连接时传递应用用户,再让Audit Plugin记录这些属性:
Laravel端配置连接属性
在config/database.php的数据库连接配置中,添加PDO连接属性:'mysql' => [ // ... 其他配置 'options' => extension_loaded('pdo_mysql') ? array_filter([ // ... 原有PDO选项 \PDO::ATTR_CONNECT_ATTRS => [ 'application_user' => function() { return Auth::user()?->name ?? 'unknown'; }, ], ]) : [], ],注意:如果使用Doctrine ORM,需要确保Laravel的数据库配置会被Doctrine继承——大部分Laravel-Doctrine集成包(比如
laravel-doctrine/orm)会复用Laravel的数据库连接配置,所以这个设置会生效。MariaDB端配置Audit Plugin
修改配置文件,让Audit Plugin记录连接属性:server_audit_events = CONNECT,QUERY,TABLE server_audit_output_fields = timestamp,user,host,db,connect_attrs,query,table重启服务后,审计日志的
connect_attrs字段会包含你设置的application_user值。
方案3:应用日志与审计日志关联(无需改数据库配置)
如果不想修改MariaDB配置,可以通过请求ID关联应用日志和审计日志:
- 在Laravel的请求开始时生成唯一
request_id,并存入日志上下文 - 同时记录当前数据库连接的ID(可以通过
DB::connection()->getPdo()->getAttribute(\PDO::ATTR_THREAD_ID)获取) - 后续分析日志时,通过连接ID把MariaDB Audit日志(包含连接ID)和Laravel应用日志(包含request_id和应用用户)关联起来
这个方案无需修改数据库,但需要额外的日志分析步骤,适合不想动数据库配置的场景。
内容的提问来源于stack exchange,提问作者Viscountess of the Junkyard

