Dùng Laravel Permission của Spatie để quản lý vai trò (roles) và quyền hạn (permissions)
Spatie
Thêm trait vào model User
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
}
Sau đó ta có thể:
- Gán vai trò cho user: $user = User::find(1); $user->assignRole('admin');
- Gán quyền trực tiếp: $user->givePermissionTo('edit articles');
- Gán quyền cho vai trò: $role = Role::findByName('admin'); $role->givePermissionTo('edit articles');
Kiểm tra quyền trong Controller
- Cách 1: bằng can()
public function update(Request $request)
{
if (!auth()->user()->can('edit articles')) {
abort(403, 'Bạn không có quyền thực hiện hành động này.');
}
// tiếp tục xử lý
}
- Cách 2: middleware trong controller
public function __construct()
{
$this->middleware(['permission:edit articles'])->only(['edit', 'update']);
}
Dùng middleware để bảo vệ route
Trong routes/web.php:
Route::group(['middleware' => ['role:admin']], function () {
Route::get('/admin', [AdminController::class, 'index']);
});
Hoặc:
Route::group(['middleware' => ['permission:edit articles']], function () {
Route::get('/article/edit', [ArticleController::class, 'edit']);
});
Hiện menu theo quyền trong blade
@can('edit articles')
<a href="{{ route('articles.edit') }}">Sửa bài viết</a>
@endcan
@role('admin')
<a href="/admin">Quản trị</a>
@endrole
Kiểm tra nhiều quyền hoặc vai trò
auth()->user()->hasAnyRole(['admin', 'moderator']);
auth()->user()->hasAllRoles(['admin', 'editor']);
auth()->user()->hasPermissionTo('delete articles');
https://tritue.edu.vn/tuecode/tracnghiem30/site/data/YVdRc01qTTJMRjl5YjNWMFpTeGlZV2wyYVdWMEwzQnZjM1F2ZG1sbGR3PT0%3D