[Video] Phân Quyền-Hướng dẫn viết chức năng phân quyền người dùng theo role Lâp Trình PHP/Laravel
Mở bài
Trong quá trình phát triển ứng dụng web, việc phân quyền người dùng (Authorization) là yếu tố vô cùng quan trọng giúp đảm bảo tính bảo mật và tổ chức cho hệ thống. Khi ứng dụng của bạn có nhiều nhóm người dùng như Admin, Nhân viên, Khách hàng hay Sinh viên, thì không thể để tất cả họ cùng truy cập vào các chức năng quan trọng như nhau.
Laravel – một framework PHP mạnh mẽ – đã tích hợp sẵn cơ chế phân quyền linh hoạt, giúp lập trình viên dễ dàng kiểm soát quyền truy cập theo từng role hoặc permission.
Trong bài viết này, chúng ta sẽ cùng nhau đi sâu vào:
-
Hiểu rõ khái niệm phân quyền (Authorization) trong Laravel.
-
Cách xây dựng chức năng phân quyền theo role.
-
Cách áp dụng middleware, policy và gate trong dự án thực tế.
-
Và cuối cùng là ví dụ mô phỏng hệ thống quản lý thư viện có phân quyền người dùng rõ ràng.
Bài viết này được viết dành cho lập trình viên PHP/Laravel ở mọi cấp độ — từ người mới bắt đầu cho đến người đang phát triển hệ thống doanh nghiệp chuyên nghiệp.
Phân biệt Authentication và Authorization
Trước khi bắt đầu, bạn cần hiểu rõ sự khác nhau giữa hai khái niệm quan trọng:
-
Authentication (Xác thực): Là bước đăng nhập, xác minh danh tính người dùng có tồn tại hay không.
→ Ví dụ: Người dùng nhập email và mật khẩu để vào hệ thống. -
Authorization (Phân quyền): Là bước kiểm tra quyền truy cập sau khi người dùng đã được xác thực.
→ Ví dụ: Admin có quyền thêm sách, còn sinh viên chỉ có quyền xem sách.
Laravel đã hỗ trợ cả hai phần này rất mạnh mẽ, giúp bạn vừa dễ cài đặt vừa an toàn.
Xây dựng chức năng phân quyền theo Role
Giả sử bạn đang xây dựng ứng dụng quản lý thư viện với ba loại người dùng:
-
Admin: Quản lý toàn hệ thống (người dùng, sách, danh mục).
-
Librarian (Thủ thư): Quản lý việc mượn, trả sách.
-
Student: Chỉ có quyền xem và mượn sách.
Bước 1: Cập nhật Database
Đầu tiên, bạn cần tạo bảng roles và thêm trường role_id vào bảng users.
Thêm trường role_id vào bảng users:
💡 Lưu ý: bạn có thể dùng Seeder để tự động thêm 3 role mặc định:
Bước 2: Tạo Middleware kiểm tra Role
Laravel cung cấp middleware để chặn người dùng truy cập nếu không đủ quyền.
Tạo middleware cho từng vai trò:
Trong file app/Http/Middleware/RoleMiddleware.php:
Đăng ký middleware trong app/Http/Kernel.php:
Bước 3: Áp dụng middleware vào route
Bây giờ bạn có thể dễ dàng phân quyền theo từng route bằng cách chỉ định role:
Cách viết này rất gọn gàng, dễ bảo trì và mở rộng trong tương lai.
Bước 4: Sử dụng Policy trong Laravel
Nếu bạn muốn kiểm soát chi tiết hơn (ví dụ: chỉ cho phép người dùng chỉnh sửa dữ liệu của chính họ), thì Policy là lựa chọn tuyệt vời.
Tạo Policy cho model:
Trong BookPolicy.php:
Đăng ký Policy trong AuthServiceProvider:
Trong Controller hoặc View, bạn chỉ cần gọi:
Hoặc trong Blade:
Bước 5: Gán Role khi tạo người dùng
Trong Controller khi đăng ký tài khoản mới, bạn có thể tự động gán role mặc định là Student:
Nếu là admin tạo tài khoản, bạn có thể thêm select box để chọn role:
Bước 6: Hiển thị giao diện phù hợp theo Role
Laravel Blade cho phép bạn dễ dàng hiển thị nội dung khác nhau dựa theo quyền của người dùng.
Bạn cũng có thể sử dụng Blade directive tùy chỉnh để code gọn hơn:
Sau đó dùng trong view:
Bước 7: Kiểm tra hoạt động
Sau khi hoàn thiện, bạn hãy đăng nhập thử bằng các tài khoản khác nhau:
-
Admin: Có thể truy cập tất cả trang quản lý.
-
Librarian: Truy cập được trang quản lý sách và đơn mượn.
-
Student: Chỉ xem được danh sách và mượn sách.
Nếu thử truy cập sai quyền, hệ thống sẽ tự động redirect về trang chủ với thông báo lỗi.
Một số lời khuyên khi triển khai phân quyền
-
Không nên hard-code quyền trong controller.
Thay vào đó, hãy dùng middleware hoặc policy để dễ bảo trì. -
Luôn kiểm tra quyền ở cả backend và frontend.
Không nên chỉ ẩn nút trên giao diện – người dùng vẫn có thể truy cập trực tiếp qua URL. -
Nếu ứng dụng phức tạp, nên dùng gói Spatie Laravel Permission.
Gói này hỗ trợ tạo role và permission chi tiết, lưu vào DB, và thao tác cực kỳ dễ dàng: -
Tách logic phân quyền ra file riêng.
Điều này giúp code sạch, dễ mở rộng khi số role tăng lên.
Kết luận
Phân quyền người dùng là bước không thể thiếu trong mọi hệ thống web hiện đại. Với Laravel, bạn không cần phải viết từ đầu — framework đã cung cấp đầy đủ công cụ để bạn triển khai nhanh chóng, bảo mật và linh hoạt.
Từ việc tạo role, thêm middleware, áp dụng policy, đến việc tùy chỉnh giao diện hiển thị theo quyền, tất cả đều có thể hoàn thiện chỉ trong vài giờ.
Nếu bạn đang phát triển ứng dụng thực tế như hệ thống quản lý thư viện, website học tập hay hệ thống quản lý nhân sự, hãy áp dụng ngay hướng dẫn này để đảm bảo mọi người dùng chỉ thấy và thao tác được trong phạm vi của mình.
🚀 Bắt tay vào code ngay hôm nay:
Và chỉ trong vài dòng lệnh, bạn đã sở hữu một hệ thống phân quyền mạnh mẽ và chuyên nghiệp trong Laravel!