【问题标题】:How to add Laravel username to the access log of nginx?如何将 Laravel 用户名添加到 nginx 的访问日志中?
【发布时间】:2017-01-21 08:58:21
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: php laravel nginx laravel-5 access-log


    【解决方案1】:

    我在这里可能错了,但据我所知这是不可能的。访问日志由服务器 (nginx) 写入,用于记录服务器上的活动,而不是记录在服务器上运行的应用程序的详细信息。

    如果您需要记录哪些用户访问了您的 Laravel 应用程序,您可能应该为此创建一个单独的日志文件。要将“应用程序日志”(我们这样称呼它)中的条目与访问日志中的条目链接起来,您可以编写一个算法,通过比较时间戳和 IP 地址来链接这些条目。我很清楚这不是一个非常优雅的解决方案,但它可能是最快/最简单的解决方案之一。

    【讨论】:

    • 永远不要说永远 :) 。总有办法,我找到了办法,为其他可能需要类似内容的人添加响应。
    • 添加标题只是为了在几步之后将其删除并不是很优雅,但如果它有效,那么我想它是可以的。您可能应该将您的答案标记为已接受的答案。 ;)
    • 我同意最好的解决方案是您可以设置一些 Nginx 可以读取的环境变量。但是,由于没有办法做到这一点,而且 Nginx 也是一个反向代理,所以它确实是有道理的,它是处理标头的 Nginx 作业的一部分。这是一种实际上在反向代理中非常常见的技术,因为它几乎是向反向代理通知事物的事实上的方式。并且绝对是使用 cookie 更好的选择。
    • 实际上,在这种情况下,用户名可以安全地保留在那里,无需删除。这绝不会损害信息,并且根本不代表任何安全问题,因为该标头未用于系统上除了添加日志记录信息的任何内容。是输出,不是输入,在任何地方都不受信任。
    【解决方案2】:

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

    说明

    我想出的解决方案是使用中间件设置包含用户名的标头,然后创建包含该标头内容的日志格式,然后清除该标头使其不显示
    注意:此代码使用 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;
        }
    }
    

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

    protected $middleware = [
        // ....
        UserHeader::class,
    ];
    

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

    X-Username: Administrator
    

    使用标题

    现在,我们在 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';
    

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

    access_log /var/log/nginx/access-mysite.com.log with_user_combined;
    

    可选

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

    more_clear_headers 'X-Username';
    

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2021-01-04
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多