如何将 Laravel 用户名添加到 nginx 的访问日志中?

Nes*_*ert 3 php nginx access-log laravel laravel-5

任何人都知道如何将我的用户的 Laravel 用户名包含在访问日志中?我在 Ubuntu 16.04 上使用 Laravel 5.2 和 Nginx。

我知道如何将数据添加到 Nginx 的访问日志中,但是,如何将信息(在本例中为用户名)从 Laravel 传递到 Nginx 以便将该信息添加到访问日志中?

谢谢

Nes*_*ert 5

我一直在做更多的研究,并在这里和那里找到了一些小片段来实现实际的解决方案。

描述

我想出的解决方案是使用中间件设置一个包含用户名的标头,然后创建一个包含该标头内容的日志格式,然后清除该标头以便它不会显示给用户.
注意:此代码使用的是 Laravel 5.2,Laravel 5.3 或其他版本可能需要稍作调整。

设置标题

在 Laravel 中创建一个中间件,在标头中设置用户名,如下所示:

<?php 
namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Http\Request;

class UserHeader
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $user = $this->auth->user();
        if ($user) {
            $response->headers->set('X-Username', $user->name);
        } else {
            $response->headers->set('X-Username', 'Anonymous');
        }
        return $response;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册中间件 app/Http/Kernel.php

protected $middleware = [
    // ....
    UserHeader::class,
];
Run Code Online (Sandbox Code Playgroud)

这将在响应中添加这样的标头:

X-Username: Administrator
Run Code Online (Sandbox Code Playgroud)

使用标题

现在,我们在 Nginx 中处理这个头文件。
我们创建了一个日志格式来使用该变量,并$sent_http_x_username在格式中包含/etc/nginx/nginx.conf

log_format with_user_combined '$remote_addr - $sent_http_x_username [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '$pipe';
Run Code Online (Sandbox Code Playgroud)

然后我们在访问日志中使用该格式/etc/nginx/sites-enabled/mysite.com

access_log /var/log/nginx/access-mysite.com.log with_user_combined;
Run Code Online (Sandbox Code Playgroud)

可选的

然后,我们清除标头,使其不会传递给用户:

more_clear_headers 'X-Username';
Run Code Online (Sandbox Code Playgroud)

将标题留在那里并不代表任何安全问题,只要您从未决定将该信息插入逻辑的任何部分。


这也可以应用于其他类型的数据,这些数据可能对包含在我们的日志中很有用。

我希望这对其他人有帮助。