ProgrammingPiotrN / ProjectNewWork

0 stars 0 forks source link

Autoryzacja dostępu do obiektów #4

Open szymjab opened 3 months ago

szymjab commented 3 months ago

https://github.com/ProgrammingPiotrN/ProjectNewWork/blob/907a705ab417ca83ee2a85d00276f19b4765db8f/Blog/app/Http/Controllers/PostController.php#L43

W MYTRACKO stosujemy podejście, że w customowym requeście w metodzie authorize dajemy warunek, który tutaj został umieszczony w kontrolerze.

Można to też rozwiązać politykami, ale na nasze potrzeby polityki były zbyt mało elastyczne. Widzę też, że już istnieje częściowo polityka do postu :)

Więcej info o politykach: https://laravel.com/docs/11.x/authorization#creating-policies

ProgrammingPiotrN commented 2 months ago
  1. Utworzenie policies:

php artisan make:policy PostPolicy --model=Post

  1. Definicja klas w PostPolicy ( odwołanie do klasy delete ):
namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    public function delete(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}
  1. Rejestracja policy:
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
       Gate::policy(Post::class, PostPolicy::class);
    }
}
  1. Zmiany w kontrolerze:
namespace App\Http\Controllers;

use App\Models\Post;
use App\Models\User;
use Illuminate\Http\Request;

class PostController extends Controller
{
      public function delete(Post $post, $User $post)
      {
          $this->authorize('delete', $post);
          $post->delete();
          return redirect()->route('dashboard.posts')->with('success', 'Post deleted successfully.');

      }
}
  1. Utworzenie różnych żądań HTTP związanych z zasobem Post:

Route::resource('posts', PostController::class);