Представьте: клиент сообщает, что кто-то изменил цены на сайте, а кто и когда — неизвестно. Без системы аудита вы тратите часы на копание в логах сервера, но не находите виновного. Или хуже — регулятор запрашивает журнал изменений за два года, а его просто нет. Мы сталкивались с этим не раз. Поэтому внедряем систему аудита действий пользователей, которая фиксирует каждое значимое событие: кто, что, когда и с какого 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.
Свяжитесь с нами для бесплатной оценки вашего проекта. Закажите внедрение системы аудита уже сегодня.







