⛵open-admin-core - это конструктор административного интерфейса для Laravel, который поможет вам создать CRUD-функции всего с помощью нескольких строк кода.
Данный конструктор является форком проекта https://github.com/open-admin-org/open-admin и адаптирован для Bootstrap 5.3.
- ✅ Bootstrap 5.3 — современный адаптивный интерфейс
- ✅ CRUD конструктор — создание админки в несколько строк кода
- ✅ Управление ролями и правами — гибкая система RBAC
- ✅ Восстановление пароля — полный цикл сброса пароля через email
- ✅ AJAX формы — без перезагрузки страницы, с прелоадерами
- ✅ Безопасность — throttle, логирование, принудительный выход из всех устройств
- ✅ Email уведомления — с информацией об IP, времени, браузере и ОС
- ✅ Журнал операций — логирование действий администраторов
- ✅ Расширения — медиа-менеджер, редактор, конструктор страниц и другие
- PHP ^8.2
- Laravel >= 12.0
- Fileinfo PHP Extension
- База данных: MySQL 8.0+ или PostgreSQL 12+
composer create-project laravel/laravel example-app
cd example-appОтредактируйте файл config/app.php:
'url' => env('APP_URL', null),
'asset_url' => env('ASSET_URL', null),
'timezone' => 'Europe/Moscow',
'locale' => 'ru',Создайте символическую ссылку для публичных файлов:
php artisan storage:linkPostgreSQL (рекомендуется)
В файле .env:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=your_database
DB_USERNAME=postgres
DB_PASSWORD=postgresДля оптимальной работы установите расширение pg_trgm:
CREATE EXTENSION IF NOT EXISTS pg_trgm;Проверить наличие расширения:
SELECT extname FROM pg_extension;MySQL
В файле .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=root
DB_PASSWORD=rootДля MySQL 8.0+ рекомендуется использовать utf8mb4_unicode_ci:
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_cicomposer require dedermus/open-admin-corephp artisan vendor:publish --provider="OpenAdminCore\Admin\AdminServiceProvider"Эта команда опубликует:
- Конфигурацию в
config/admin.php - Языковые файлы в
resources/lang - Миграции в
database/migrations - Ассеты в
public/vendor/open-admin
В файле config/filesystems.php добавьте или обновите диски:
'disks' => [
// ... другие диски
'uploads' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads',
'visibility' => 'public',
'throw' => false,
'permissions' => [
'file' => [
'public' => 0644,
'private' => 0600,
],
'dir' => [
'public' => 0755,
'private' => 0700,
],
],
],
'admin' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads',
'visibility' => 'public',
'throw' => false,
'permissions' => [
'file' => [
'public' => 0644,
'private' => 0600,
],
'dir' => [
'public' => 0755,
'private' => 0700,
],
],
],
],В файле config/admin.php:
'https' => env('ADMIN_HTTPS', true),php artisan admin:installЭта команда выполнит:
- Запуск всех миграций (
php artisan migrate) - Заполнение таблиц начальными данными (пользователь admin, роли, разрешения)
- Создание директории
app/Adminсо следующей структурой:
app/Admin/
├── Controllers/
│ ├── HomeController.php
│ ├── AuthController.php
│ └── ExampleController.php
├── bootstrap.php
└── routes.php
Откройте в браузере: http://localhost/admin
Учетные данные по умолчанию:
- Логин:
admin - Пароль:
admin
|
Пакет поддерживает функционал восстановления пароля через email. Для его работы необходимо:
- Настроить отправку email в файле
.env:
MAIL_MAILER=smtp
MAIL_HOST=smtp.mail.ru
MAIL_PORT=465
MAIL_USERNAME=your-email@example.com
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=your-email@example.com
MAIL_FROM_NAME="Admin Panel"-
Убедиться, что у пользователей заполнен email. Если email отсутствует, пользователь не сможет восстановить пароль.
-
Настроить параметры восстановления в
config/admin.php:
'auth' => [
'password_reset' => [
'enabled' => true, // Включить/отключить функционал
'expire' => 60, // Время жизни ссылки (минут)
'throttle' => 3, // Максимум попыток
'throttle_decay_minutes' => 60, // Время блокировки после превышения
],
],- Настроить логирование в config/logging.php:
'channels' => [
'password_reset' => [
'driver' => 'daily',
'path' => storage_path('logs/password-reset.log'),
'level' => 'info',
'days' => 30,
],
],Процесс восстановления
-
Пользователь нажимает "Забыли пароль?" на странице входа
-
Вводит логин или email
-
На почту приходит ссылка для сброса пароля
-
Пользователь переходит по ссылке и устанавливает новый пароль
-
После успешного сброса:
-
Происходит принудительный выход из всех устройств
-
На почту приходит уведомление с информацией:
-
Время изменения пароля
-
IP-адрес
-
Браузер, ОС и тип устройства
-
-
-
Пользователь перенаправляется на страницу входа
Безопасность
✅ Ограничение количества попыток (throttle)
✅ Токены сброса имеют ограниченное время жизни
✅ Общие сообщения об успехе (не сообщаем, существует ли пользователь)
✅ Логирование всех попыток в отдельный канал
✅ Принудительный выход из всех устройств после сброса
✅ Email-уведомление с информацией об IP и устройстве
✅ AJAX-отправка форм с защитой от двойной отправки
- Очистка устаревших токенов:
php artisan admin:clear-resetsРекомендуется добавить эту команду в расписание (cron):
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('admin:clear-resets')->daily();
}Процесс восстановления пароля
- Пользователь нажимает "Забыли пароль?" на странице входа
- Вводит логин или email
- Если учетная запись существует и имеет email, отправляется ссылка на сброс
- Пользователь переходит по ссылке и устанавливает новый пароль
- После успешного сброса выполняется перенаправление на страницу входа
Безопасность
- Ограничение количества попыток (throttle)
- Токены сброса имеют ограниченное время жизни
- Общие сообщения об успехе (не сообщаем, существует ли пользователь)
- Логирование всех попыток в отдельный канал
- Пароль должен соответствовать требованиям безопасности (минимум 8 символов)
Основные настройки находятся в файле config/admin.php:
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
directory |
Директория админки | app/Admin |
route.prefix |
Префикс маршрутов | admin |
database.users_table |
Таблица пользователей | admin_users |
database.roles_table |
Таблица ролей | admin_roles |
database.permissions_table |
Таблица разрешений | admin_permissions |
database.menu_table |
Таблица меню | admin_menu |
database.operation_log_table |
Журнал операций | admin_operation_log |
Пакет предоставляет набор Artisan-команд для управления админ-панелью:
| Команда | Описание |
|---|---|
php artisan admin |
Список всех доступных команд |
php artisan admin:install |
Установка админ-панели |
php artisan admin:uninstall |
Удаление админ-панели |
php artisan admin:create-user |
Создание нового пользователя |
php artisan admin:reset-password |
Сброс пароля пользователя |
php artisan admin:make {model} |
Генерация контроллера для модели |
php artisan admin:form {name} |
Генерация виджета формы |
php artisan admin:action {name} |
Генерация действия |
php artisan admin:permissions |
Генерация разрешений на основе таблиц |
php artisan admin:generate-menu |
Генерация меню на основе маршрутов |
php artisan admin:menu |
Вывод структуры меню |
php artisan admin:config |
Сравнение конфигурации с оригиналом |
php artisan admin:minify |
Минификация CSS и JS ассетов |
php artisan admin:extend {extension} |
Создание расширения |
php artisan admin:import {extension} |
Импорт расширения |
php artisan admin:dev-links |
Создание символических ссылок для разработки |
php artisan admin:publish |
Публикация ресурсов |
Создание контроллера для модели Post:
php artisan admin:make "App\Models\Post" --title="Статьи"После выполнения команды будет создан контроллер app/Admin/Controllers/PostController.php с готовыми методами для CRUD операций.
Добавление маршрута в app/Admin/routes.php:
$router->resource('posts', PostController::class);Генерация разрешений для таблицы posts:
php artisan admin:permissions --tables=postsОбновление до новой версии пакета:
composer update dedermus/open-admin-core
php artisan vendor:publish --tag=open-admin-assets --force
php artisan view:clear
php artisan config:clearПакет поддерживает расширения, адаптированные для Bootstrap 5.3:
| Расширение | Описание |
|---|---|
| helpers | Инструменты для разработки |
| media-manager | Управление файлами |
| config | Менеджер конфигурации |
| grid-sortable | Сортируемые таблицы |
| Ckeditor | Визуальный редактор |
| api-tester | Тестирование API |
| scheduling | Управление задачами |
| phpinfo | Информация о PHP |
| log-viewer | Просмотр логов |
| page-designer | Конструктор страниц |
| reporter | Отчеты об ошибках |
| redis-manager | Управление Redis |
Установка расширения
composer require dedermus/helpers
php artisan admin:import helpers| № | Код | Язык | RTL |
|---|---|---|---|
| 1 | en | Английский | ❌ |
| 2 | ru | Русский | ❌ |
| 3 | uk | Украинский | ❌ |
| 4 | de | Немецкий | ❌ |
| 5 | es | Испанский | ❌ |
| 6 | fr | Французский | ❌ |
| 7 | zh_CN | Китайский (упрощённый) | ❌ |
| 8 | zh_TW | Китайский (традиционный) | ❌ |
| 9 | pl | Польский | ❌ |
| 10 | it | Итальянский | ❌ |
| 11 | ja | Японский | ❌ |
| 12 | pt | Португальский | ❌ |
| 13 | pt-BR | Португальский (Бразилия) | ❌ |
| 14 | tr | Турецкий | ❌ |
| 15 | nl | Нидерландский | ❌ |
| 16 | id | Индонезийский | ❌ |
| 17 | ms | Малайский | ❌ |
| 18 | ko | Корейский | ❌ |
| 19 | he | Иврит | ✅ |
| 20 | fa | Персидский (фарси) | ✅ |
| 21 | bn | Бенгальский | ❌ |
| 22 | az | Азербайджанский | ❌ |
| 23 | ar | Арабский | ✅ |
Для поддержки языков с направлением письма справа налево:
-
Откройте файл
vendor/dedermus/open-admin-core/src/Traits/HasAssets.php -
В массиве
$baseCssзамените:bootstrap.min.css→bootstrap.rtl.min.cssAdminLTE.min.css→AdminLTE.rtl.min.css
Решение: Запустите composer dump-autoload:
composer dump-autoloadРешение: Убедитесь, что установлено расширение pg_trgm:
CREATE EXTENSION IF NOT EXISTS pg_trgm;Решение: Проверьте файл app/Admin/routes.php и убедитесь, что префикс маршрутов в config/admin.php совпадает с URL.
open-admin-core распространяется под лицензией The MIT License (MIT).