Gói quyền Laravel của Spatie không hỗ trợ phân cấp vai trò hoặc kế thừa ra khỏi hộp. Điều này có nghĩa là nó không có chức năng tích hợp để xác định mối quan hệ giữa cha mẹ và con cái giữa các vai trò trong đó vai trò cha mẹ tự động kế thừa tất cả các quyền của vai trò con cái.
Làm thế nào Spatie xử lý vai trò và quyền
- Vai trò và quyền được lưu trữ dưới dạng các thực thể riêng biệt trong cơ sở dữ liệu.
- Quyền được gán trực tiếp cho vai trò.
- Người dùng được gán vai trò và thông qua các vai trò đó, họ có được các quyền liên quan.
- Bạn cũng có thể gán quyền trực tiếp cho người dùng.
- Khi kiểm tra quyền, gói xem xét tất cả các quyền được gán trực tiếp cho người dùng cộng với các vai trò được kế thừa qua.
Phân cấp và kế thừa vai trò
- Gói coi vai trò là các thực thể phẳng mà không có bất kỳ hệ thống phân cấp nào.
- Không có cơ chế tích hợp để gán một vai trò này cho một vai trò khác hoặc có "vai trò cha mẹ" tự động kế thừa tất cả các quyền của "vai trò con" [1] [4].
- Người dùng có thể có nhiều vai trò được chỉ định, cho phép linh hoạt kết hợp các quyền từ các vai trò khác nhau thay vì dựa vào kế thừa phân cấp [2].
Phương pháp phổ biến để thực hiện phân cấp vai trò với Spatie
Vì Spatie không hỗ trợ kế thừa vai trò, các nhà phát triển thường thực hiện các cách giải quyết như:
-Gán tất cả các quyền một cách rõ ràng cho các vai trò cấp cao hơn: Thay vì kế thừa quyền từ vai trò trẻ em, bạn chỉ định thủ công tất cả các quyền có liên quan cho từng vai trò, bao gồm các vai trò cấp cao hơn như "siêu admin" có tất cả các quyền của vai trò thấp hơn [2] [5].
- Vai trò xếp hạng với các giá trị số nguyên: Một số nhà phát triển gán thứ hạng hoặc cấp độ cho vai trò (ví dụ: 1 cho người dùng, 2 cho người điều hành, 3 cho quản trị viên) và sau đó thực hiện logic trong ứng dụng của họ để cấp quyền dựa trên thứ hạng vai trò của người dùng, mô phỏng phân cấp hiệu quả [2].
- Nhiều vai trò cho mỗi người dùng: Gán nhiều vai trò cho người dùng cần có quyền kết hợp từ các vai trò khác nhau, tránh sự cần thiết cho các vai trò phân cấp [2].
Bản tóm tắt
- Gói của Spatie tập trung vào việc quản lý vai trò và quyền như các thực thể phẳng, riêng biệt.
-Nó khuyến khích gán quyền trực tiếp cho vai trò và người dùng mà không cần kế thừa vai trò.
- Phân cấp và kế thừa vai trò phải được thực hiện thủ công nếu cần, thông thường bằng cách gán các quyền một cách rõ ràng hoặc sử dụng logic xếp hạng tùy chỉnh.
- Thiết kế này tránh được các vấn đề tiềm năng trong đó các quyền của vai trò phụ huynh phụ thuộc vào vai trò của con cái, điều này có thể gây ra sự phức tạp về bảo mật hoặc quản lý [1] [2] [4].
Do đó, trong khi Spatie cung cấp một hệ thống quyền mạnh mẽ và linh hoạt, nó không xử lý phân cấp vai trò và kế thừa trong nội bộ; Các nhà phát triển phải thiết kế các chiến lược của riêng họ để mô phỏng hành vi đó nếu được yêu cầu.
Trích dẫn:
[1] https://github.com/spatie/laravel-permission/issues/685
.
[3] https://spatie.be/docs/laravel-permission/v6/introduction
[4] https://stackoverflow.com/questions/67520321/how-to-implement-hierarchical-rbac-in-laravel
.
.
[7] https://www.youtube.com/watch?v=3HSBJCVWH78
[8] https://spatie.be/docs/laravel-permission/v6/basic-usage/role-permissions
[9] https://stackoverflow.com/questions/78213905/hierarchical-roles-for-a-user-with-child-roles-having-different-permissions-on
[10] https://stackoverflow.com/questions/75772209/spatie-role-plugin-for-laravel-seed-users-with-roles-doesnt-assignrole
[11] https://dev.to/varzoeaa/spatie-permissions-vs-laravel-policies-and-gates-handling-role-based-access-1bdn