Представьте: клиент сообщает, что кто-то изменил цены на сайте, а кто и когда — неизвестно. Без системы аудита вы тратите часы на копание в логах сервера, но не находите виновного. Или хуже — регулятор запрашивает журнал изменений за два года, а его просто нет. Мы сталкивались с этим не раз. Поэтому внедряем систему аудита действий пользователей, которая фиксирует каждое значимое событие: кто, что, когда и с какого IP.
Без такой системы восстановление цепочки событий превращается в археологию, а каждый запрос регулятора грозит штрафом до 4% годового оборота. Наша система не только фиксирует события, но и позволяет быстро фильтровать журнал по десятку параметров, экономя часы работы администратора. Например, у крупного e-commerce проекта ежедневно генерируется до 50 000 записей аудита, и без автофильтрации поиск инцидента занимал бы дни.
Какие проблемы решает аудит пользователей?
Система аудита действий пользователей решает проблему отсутствия прозрачности: без журнала невозможно понять, кто изменил важные данные или удалил запись. Аудит даёт полную картину.
- Регуляторные риски. 152-ФЗ и GDPR требуют отслеживать доступ к персональным данным. Нарушение — штрафы до 4% оборота.
- Производительность. Синхронная запись в каждый запрос убивает БД. Мы используем очереди и пакетную вставку — это снижает нагрузку на 80%.
- Долгий поиск инцидентов. Без фильтрации по пользователю, событию и дате найти нужную запись — иголка в стоге сена.
Что и как логировать
Обязательные события
| Событие | Обязательность | Рекомендованный метод |
|---|---|---|
| Вход/выход | Обязательно | Laravel Events |
| Неудачные попытки входа | Обязательно | Laravel Events |
| Изменение пароля, email | Обязательно | Observer модели User |
| Изменение прав доступа, ролей | Обязательно | Observer или пакет |
| CRUD критических сущностей | Обязательно | Пакет Auditing |
| Платёжные операции | Обязательно | Observer или событие |
| Экспорт данных | Обязательно | Middleware |
| Просмотр чужих данных | Опционально | Middleware |
| API-запросы к админке | Опционально | Middleware |
Структура таблицы аудита
CREATE TABLE audit_logs (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id) ON DELETE SET NULL,
event VARCHAR(100) NOT NULL, -- 'user.password_changed'
subject_type VARCHAR(100), -- 'App\\Models\\User'
subject_id BIGINT, -- ID изменённой сущности
old_values JSONB, -- состояние до
new_values JSONB, -- состояние после
ip_address INET,
user_agent TEXT,
session_id VARCHAR(100),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_audit_user ON audit_logs(user_id);
CREATE INDEX idx_audit_event ON audit_logs(event);
CREATE INDEX idx_audit_subject ON audit_logs(subject_type, subject_id);
CREATE INDEX idx_audit_created ON audit_logs(created_at DESC);
Поскольку таблица аудита может расти до сотен гигабайт, важно правильно индексировать поля. Мы используем индексы на user_id, event, subject_type+subject_id и created_at DESC — это ускоряет типовые запросы в 20 раз.
Как быстро найти нужное событие в журнале?
С правильно настроенными индексами и фильтрацией поиск записи занимает секунды. Добавьте интерфейс с выбором дат, пользователя и типа события — и администратор перестанет тратить часы на ручной просмотр логов. Мы реализуем такую панель за пару дней.
Как реализовать систему аудита
Использование готового пакета
Пакет owen-it/laravel-auditing — наиболее распространённый выбор. Подходит для 80% проектов. Настройка занимает час.
// composer require owen-it/laravel-auditing
// В модели
use OwenIt\Auditing\Contracts\Auditable;
class User extends Model implements Auditable
{
use \OwenIt\Auditing\Auditable;
// Исключить из аудита чувствительные поля
protected $auditExclude = ['password', 'remember_token'];
// Только при определённых событиях
protected $auditEvents = ['created', 'updated', 'deleted'];
}Пакет ускоряет внедрение в 4 раза по сравнению с кастомной реализацией. Однако для нестандартных сценариев (логирование неудачных входов, API-запросов) лучше подходит Observer.
Кастомный Observer
// app/Observers/AuditObserver.php
class AuditObserver
{
public function updated(Model $model): void
{
if (!$model->wasChanged()) {
return;
}
AuditLog::create([
'user_id' => auth()->id(),
'event' => strtolower(class_basename($model)) . '.updated',
'subject_type' => get_class($model),
'subject_id' => $model->getKey(),
'old_values' => $model->getOriginal(),
'new_values' => $model->getChanges(),
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
]);
}
}
// Регистрация в AppServiceProvider
User::observe(AuditObserver::class);
Order::observe(AuditObserver::class);
Middleware и события аутентификации
Пример middleware для HTTP-запросов
// app/Http/Middleware/AuditRequests.php
class AuditRequests
{
private array $auditedRoutes = [
'admin.*',
'api.users.*',
'api.settings.*',
];
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
if ($this->shouldAudit($request)) {
AuditLog::create([
'user_id' => auth()->id(),
'event' => 'http.' . strtolower($request->method()),
'new_values' => [
'url' => $request->url(),
'method' => $request->method(),
'status' => $response->status(),
],
'ip_address' => $request->ip(),
]);
}
return $response;
}
} Почему асинхронная запись аудита критична?
Синхронная запись в каждом запросе — нагрузка на БД. Решения:
- Асинхронная запись через очереди — отправка задачи
WriteAuditLogна очередьaudit. - Пакетная вставка — накапливать записи в Redis, сбрасывать раз в минуту.
- Отдельная БД для аудита — изолирует нагрузку.
// Асинхронная запись через очереди
dispatch(new WriteAuditLog($data))->onQueue('audit');
// Пакетная вставка — накапливать в Redis, сбрасывать раз в минуту
Redis::rpush('audit_queue', json_encode($data));
// Отдельная БД для аудита
// config/database.php
'audit' => [
'driver' => 'pgsql',
'database' => 'audit_db',
// ...
] Сравнение подходов: пакет vs кастом
| Критерий | owen-it/laravel-auditing | Кастомный Observer |
|---|---|---|
| Время внедрения | 1 час | 4-8 часов |
| Гибкость | Ограниченная | Полная |
| Документация | Отличная | Нет |
| Обновления | Активные | Сами |
| Производительность | Хорошая (есть конфиги) | Зависит от реализации |
Для типового проекта выбираем пакет. Если нужна нестандартная логика — свяжитесь с нами для консультации.
Процесс и сроки внедрения
Что входит в работу
- Проектирование схемы аудита под ваши сущности
- Реализация логирования (пакет или кастом)
- Настройка асинхронной записи через очереди
- Интерфейс просмотра с фильтрацией по пользователю, событию, временному диапазону, сущности
- Ротация логов (Artisan-команда)
- Документация и миграции
- Обучение администраторов
- Гарантия 6 месяцев
Сроки реализации
- Базовая модель + Observer для ключевых сущностей — от 2 до 3 дней
- Полноценная система с очередями, ротацией и UI — от 5 до 7 дней
Точный срок зависит от количества моделей и сложности бизнес-логики. Мы оценим ваш проект — просто свяжитесь с нами. Опыт работы с Laravel более 5 лет, реализовали аудит для 20+ проектов. Гарантируем соответствие требованиям 152-ФЗ и GDPR.
Свяжитесь с нами для оценки вашего проекта. Закажите внедрение системы аудита уже сегодня.







