You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否借助Doctrine与MariaDB Audit Plugin记录Laravel应用用户名?

问题解答

MariaDB Audit Plugin本身无法直接记录Laravel应用层用户——它默认只会捕获数据库连接配置的用户(比如你的MyServerSideConfiguredMariaDBUser),但可以通过以下几种间接方案实现需求:

方案1:会话级自定义变量+审计日志格式扩展

在Laravel应用层给每个数据库会话注入应用用户变量,再配置Audit Plugin把这个变量写入日志:

  1. 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的全局中间件组里,确保所有请求都会执行。

  2. 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记录这些属性:

  1. 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的数据库连接配置,所以这个设置会生效。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:46:02