Chuyển đến nội dung chính

第 10 課:授權 — 門禁與策略

大門、政策、權限。 Spatie Laravel 權限包。資源授權、策略自動發現。刀片 @can 指令。超管理員,角色層次。

💻 程式設計 — 第 10 課 第 10 課:授權 — 門禁與策略

Laravel:從基礎到高級

第 3 部分:身份驗證和授權

亞洲開發網

1.蓋茨

// AppServiceProvider
use Illuminate\Support\Facades\Gate;

Gate::define('manage-products', function (User $user) {
    return $user->role === 'admin' || $user->role === 'staff';
});

Gate::define('update-product', function (User $user, Product $product) {
    return $user->id === $product->user_id || $user->role === 'admin';
});

// Sử dụng
if (Gate::allows('manage-products')) { ... }
Gate::authorize('update-product', $product);

2、政策

php artisan make:policy ProductPolicy --model=Product
namespace App\Policies;

class ProductPolicy
{
    public function viewAny(User $user): bool
    {
        return true;
    }

    public function create(User $user): bool
    {
        return $user->hasPermissionTo('create products');
    }

    public function update(User $user, Product $product): bool
    {
        return $user->id === $product->user_id
            || $user->hasRole('admin');
    }

    public function delete(User $user, Product $product): bool
    {
        return $user->hasRole('admin');
    }
}

// Controller
public function update(Request $request, Product $product)
{
    $this->authorize('update', $product);
    // ...
}

3. Spatie Laravel 權限

composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;
}

// Tạo roles & permissions
$admin = Role::create(['name' => 'admin']);
$editor = Role::create(['name' => 'editor']);

Permission::create(['name' => 'create products']);
Permission::create(['name' => 'edit products']);
$admin->givePermissionTo(Permission::all());
$editor->givePermissionTo(['create products', 'edit products']);

// Gán
$user->assignRole('editor');
$user->hasRole('admin'); // false
$user->hasPermissionTo('edit products'); // true

4. 刀片授權

@can('update', $product)
    <a href="{{ route('products.edit', $product) }}">Sửa</a>
@endcan

@role('admin')
    <a href="/admin">Admin Panel</a>
@endrole

@hasanyrole('admin|editor')
    <x-editor-toolbar />
@endhasanyrole

下一篇: OAuth2、護照和社交名流。