Внедрение системы RBAC (Role-Based Access Control) для Stroyprofit CRM с возможностью создания новых ролей и назначения им прав через UI.
| Компонент | Описание |
|---|---|
| Хранение ролей | Поле role (string) в таблице users |
| Класс Role | Статический класс с константами app/Models/Role.php |
| Проверка ролей | Helper функция hasRole() в app/Helpers/roles.php |
| Middleware | EnsureUserHasRole - проверка через in_array() |
| Точки проверки | 155+ вызовов hasRole() в Blade, контроллерах, FormRequest |
Текущие роли: admin, manager, brigadier
1.1 Таблица roles
database/migrations/2026_02_03_000001_create_roles_table.php
id, slug (unique), name, description, is_system (boolean), timestamps1.2 Таблица permissions
database/migrations/2026_02_03_000002_create_permissions_table.php
id, slug (unique), name, module, action, description, timestamps1.3 Связь ролей и прав role_has_permissions
database/migrations/2026_02_03_000003_create_role_has_permissions_table.php
role_id (FK), permission_id (FK), составной PK1.4 Добавление role_id в users
database/migrations/2026_02_03_000004_add_role_id_to_users_table.php
role_id (FK nullable) - связь с таблицей rolesapp/Models/Role.phpПреобразовать из статического класса в Eloquent модель:
permissions() (belongsToMany)users() (hasMany)hasPermission(), givePermissions(), syncPermissions()app/Models/Permission.phproles() (belongsToMany)getGroupedByModule()app/Models/User.phpДобавить:
role_id в $fillableroleModel() (belongsTo Role)hasRole() - сначала проверяет role_id, fallback на rolehasPermission() - админ имеет все праваhasAnyPermission()getAllPermissions()app/Helpers/roles.phpgetRoles() - сначала из БД, fallback на константыhasRole() - использовать метод модели UserhasPermission() - новая функцияhasAnyPermission() - новая функцияroleName() - сначала из БД, fallback на константыapp/Http/Middleware/EnsureUserHasRole.php$user->hasRole() вместо прямой проверкиapp/Http/Middleware/EnsureUserHasPermission.phpmiddleware('permission:orders.create')app/Http/Middleware/EnsureUserHasAnyPermission.phpmiddleware('permission.any:orders.create,orders.update')bootstrap/app.php$middleware->alias([
'role' => EnsureUserHasRole::class,
'permission' => EnsureUserHasPermission::class,
'permission.any' => EnsureUserHasAnyPermission::class,
]);
app/Providers/AppServiceProvider.phpBlade::if('role', fn($roles) => hasRole($roles));
Blade::if('permission', fn($permission) => hasPermission($permission));
Blade::if('anypermission', fn($permissions) => hasAnyPermission($permissions));
Использование:
@role('admin')...@endrole
@permission('orders.delete')...@endpermission
database/seeders/RbacSeeder.phpis_system=truerole_id на основе roleapp/Http/Controllers/Admin/RoleController.phproutes/web.php)Route::prefix('admin/roles')->middleware('role:admin')->group(function(){
Route::get('', [RoleController::class, 'index'])->name('admin.roles.index');
Route::get('create', [RoleController::class, 'create'])->name('admin.roles.create');
Route::post('', [RoleController::class, 'store'])->name('admin.roles.store');
Route::get('{role}', [RoleController::class, 'show'])->name('admin.roles.show');
Route::put('{role}', [RoleController::class, 'update'])->name('admin.roles.update');
Route::delete('{role}', [RoleController::class, 'destroy'])->name('admin.roles.destroy');
});
resources/views/admin/roles/index.blade.php - список ролейresources/views/admin/roles/edit.blade.php - создание/редактирование с чекбоксами правДобавить в resources/views/layouts/menu.blade.php:
<li><a href="{{ route('admin.roles.index') }}">Роли и права</a></li>
app/Http/Requests/User/StoreUser.phprole на role_id| Модуль | Права |
|---|---|
| orders | view, create, update, delete, export, documents, photos, maf, generate |
| reclamations | view, create, update, delete, documents, photos, spare_parts |
| maf | view, update, import, export, passports |
| maf_orders | view, create, update, delete |
| catalog | view, create, update, delete, import, export, certificates |
| schedule | view, create, update, delete, export |
| spare_parts | view, create, update, delete, import, export |
| spare_part_orders | view, create, update, delete, ship |
| spare_part_reservations | view, manage |
| spare_part_inventory | view |
| contracts | view, create, update, delete |
| users | view, create, update, delete |
| responsibles | view, create, update, delete |
| reports | view |
| import | view, create |
| districts | view, manage |
| areas | view, manage |
| pricing_codes | view, manage |
| admin | clear_data, year_data, roles |
Все права (*)
php artisan migrate && php artisan db:seed --class=RbacSeederhasRole() продолжает работатьrole:admin,manager работает без изменений@if(hasRole('admin')) работаютhasPermission() опциональна| Файл | Действие |
|---|---|
app/Models/Role.php |
Переработать в Eloquent модель |
app/Models/User.php |
Добавить role_id, методы hasPermission |
app/Models/Permission.php |
Создать новую модель |
app/Helpers/roles.php |
Обновить с поддержкой БД |
app/Http/Middleware/EnsureUserHasRole.php |
Использовать метод модели |
bootstrap/app.php |
Зарегистрировать новые middleware |
app/Providers/AppServiceProvider.php |
Добавить Blade директивы |
database/seeders/RbacSeeder.php |
Создать сидер |
app/Http/Controllers/Admin/RoleController.php |
Создать контроллер |
resources/views/admin/roles/*.blade.php |
Создать views |
resources/views/layouts/menu.blade.php |
Добавить пункт меню |
routes/web.php |
Добавить маршруты ролей |
После внедрения: