Как добавить имя пользователя Laravel в журнал доступа nginx?

Кто-нибудь имеет представление о том, как включить имя пользователя Laravel моих пользователей в журнал доступа?
Я использую Laravel 5.2 с Nginx на Ubuntu 16.04.

Я знаю, как добавить данные в журнал доступа в Nginx, но как передать информацию (в данном случае имя пользователя) из Laravel в Nginx, чтобы добавить эту информацию в журнал доступа?

Спасибо

0

Решение

Я проводил больше исследований и нашел маленькие кусочки, чтобы найти реальное решение.

Описание

Решение, которое я придумал, состоит в том, чтобы использовать Middleware для установки заголовка, который включает имя пользователя, затем создать формат журнала, который включает содержимое этого заголовка, а затем очистить этот заголовок, чтобы он не показывался пользователю ,
Замечания: Этот код использует 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';

Оставление заголовка не представляет проблемы безопасности, если вы никогда не решите внедрить эту информацию в какую-либо часть вашей логики.


Это также может быть применено к другим видам данных, которые могут быть полезны для включения в наши журналы.

Я надеюсь, что это помогает другим.

1

Другие решения

Я могу ошибаться, но, насколько я знаю, это невозможно. Журнал доступа записывается сервером (nginx) для регистрации активности на сервере, а не для регистрации особенностей приложения, которое запускается на сервере.

Если вам нужно регистрировать, какие пользователи обращаются к вашему приложению Laravel, вам, вероятно, следует создать отдельный файл журнала для этого. Чтобы связать записи в этом «журнале приложений» (назовем его так) с записями в журнале доступа, вы можете написать алгоритм, который связывает эти записи путем сравнения временных меток и IP-адресов. Я хорошо осознаю тот факт, что это не очень элегантное решение, но оно может быть одним из самых быстрых / простых решений.

0