Phân quyền với laravel permission
Cài đặt laravel app với lệnh
"composer create-project laravel/laravel la11permission"
Tiếp theo cài đặt gói :
" composer require spatie/laravel-permission "
Tiếp theo public các config với lệnh :
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Chúng ta cần thực hiện theo các bước cơ bản sau là được :
https://spatie.be/docs/laravel-permission/v6/installation-laravel
Và mình thêm trait HasRole vào trong model nào mình cần sử dụng để lấy info người đăng nhập :
" use HasRoles;"
Chúng ta cần thêm middleware để có thể sử dụng bận sau : bootstrap\app.php
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Spatie\Permission\Middleware\PermissionMiddleware;
use Spatie\Permission\Middleware\RoleMiddleware;
use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__ . '/../routes/web.php',
commands: __DIR__ . '/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => RoleMiddleware::class,
'permission' => PermissionMiddleware::class,
'role_or_permission' => RoleOrPermissionMiddleware::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Sử dụng trong middleware \routes\web.php:
Route::get('post', [PostController::class, 'index'])
->middleware(['role_or_permission:admin|post.view']);
Ở đây mình sử dụng middleware còn nếu sử dụng trong controller chúng ta đã tách biệt ra 1 function là middleware :
Ví dụ :
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Routing\Controllers\HasMiddleware;
use Illuminate\Routing\Controllers\Middleware;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
// class PostController extends Controller implements HasMiddleware
class PostController extends Controller
{
public static function middleware(): array
{
return [
'auth',
new Middleware('permission:post.index', only: ['index']),
new Middleware('subscribed', except: ['store']),
];
}
public function demo()
{
Gate::authorize('viewAny', Post::class);
}
/**
* Display a listing of the resource.
*/
public function index()
{
// Gate::authorize('viewAny', Post::class);
// dd($user);
return view('post.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
Gate::authorize('create', Post::class);
dd(3);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
Trong policy thì chúng ta có 1 file Policy sử dụng như sau :
<?php
namespace App\Policies;
use App\Models\Post;
use App\Models\User;
use Illuminate\Auth\Access\Response;
use Illuminate\Support\Carbon;
class PostPolicy
{
// chạy trước khi vào policy có tác dụng đảm bảo người có quyền admin có thể vượt qua mọi thứ
public function before(?User $user)
{
if ($user->hasRole('admin')) {
return true;
}
return null;
}
/**
* Determine whether the user can view any models.
*/
public function viewAny(?User $user): bool
{
return true;
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Post $post): bool {}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
if ($user->id === 1) {
return true;
} else {
return true;
}
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Post $post): bool
{
if ($post->created_at > Carbon::now()->subHours(2)) {
}
return $user->id === $post->user_id || $user->id === $post->user_id;
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Post $post): bool
{
//
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, Post $post): bool
{
//
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, Post $post): bool
{
//
}
}
Trong view thì ta sử dụng như sau :
@extends('layouts.app')
@section('content')
@can('post.create') // dùng cho laravel perrmission ,
<a name="" id="" class="btn btn-primary" href="#" role="button">Create permission</a>
@endcan
@can('viewAny',App\Models\Post::class) // dùng cho policy
<a name="" id="" class="btn btn-primary" href="#" role="button">Create</a>
@endcan
<h3>Xin chào</h3>
@endsection
Đây là ví dụ về cách sử dụng permission kết hợp policy trong middleware ,controller và view