У цій частині ми розглянемо, як реалізувати авторизацію для нашої системи управління правами доступу з використанням політик Laravel.
Створення політик
Спочатку створимо політики для наших моделей:
|
1 2 |
php artisan make:policy ProjectPolicy php artisan make:policy ProjectPermissionPolicy |
ProjectPolicy
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php namespace App\Policies; use App\Models\Project; use App\Models\User; use App\Models\ProjectUser; class ProjectPolicy { public function viewAny(User $user) { // Припустимо, що всі аутентифіковані користувачі можуть бачити список проектів return true; } public function view(User $user, Project $project) { return $project->users()->where('user_id', $user->id)->exists(); } public function create(User $user) { // Тут може бути логіка, яка визначає, чи може користувач створювати нові проекти return true; } public function update(User $user, Project $project) { return $project->users() ->where('user_id', $user->id) ->whereHas('roles', function ($query) { $query->where('name', 'admin'); }) ->exists(); } public function delete(User $user, Project $project) { // Аналогічно до update return $this->update($user, $project); } } |
ProjectPermissionPolicy
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php namespace App\Policies; use App\Models\ProjectPermission; use App\Models\Project; use App\Models\User; use App\Models\ProjectUser; class ProjectPermissionPolicy { public function viewAny(User $user, Project $project) { return $project->users() ->where('user_id', $user->id) ->whereHas('roles', function ($query) { $query->where('name', 'admin'); }) ->exists(); } public function create(User $user, Project $project) { return $this->viewAny($user, $project); } public function update(User $user, ProjectPermission $permission, Project $project) { return $this->viewAny($user, $project); } public function delete(User $user, ProjectPermission $permission, Project $project) { return $this->viewAny($user, $project); } } |
Реєстрація політик
У app/Providers/AuthServiceProvider.php:
|
1 2 3 4 |
protected $policies = [ Project::class => ProjectPolicy::class, ProjectPermission::class => ProjectPermissionPolicy::class, ]; |
Використання політик у контролерах
Тепер ми можемо використовувати ці політики в наших контролерах. Наприклад, у ProjectPermissionController:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public function index(Request $request, Project $project) { $this->authorize('viewAny', [ProjectPermission::class, $project]); $permissions = ProjectPermission::whereHas('roles', function ($query) use ($project) { $query->where('project_id', $project->id); })->get(); return response()->json($permissions); } public function store(Request $request, Project $project) { $this->authorize('create', [ProjectPermission::class, $project]); // ... решта коду } public function update(Request $request, Project $project, ProjectPermission $permission) { $this->authorize('update', [$permission, $project]); // ... решта коду } public function destroy(Project $project, ProjectPermission $permission) { $this->authorize('delete', [$permission, $project]); // ... решта коду } |
Ці політики забезпечують, що користувачі мають відповідні права для виконання операцій з проектами та правами доступу.