Mục Lục
Mục Lục
Hướng dẫn cài đặt môi trường [Bài Viết] Hướng dẫn cài composer [Bài Viết] Hướng dẫn tạo dự án Laravel đầu tay. [Bài Viết] Hướng dẫn cấu hình cơ sở dữ liệu và bật chức năng auth có sẵn trong Laravel [Bài Viết] Hướng dẫn cài theme Acacha AdminLTE cho Laravel [Bài Viết] Hướng dẫn tắt debug khi upload dự án laravel lên HOST Video Hướng dẫn cài đặt môi trường + tạo dự án + Tìm hiểu Route qua ví dụ - Lập trình Laravel Video Hướng dẫn cài đặt dự án Laravel + Cài đặt chức năng Auth (login + register) trong Laravel Tìm hiểu Route & View & Controller Video Tìm hiểu Route trong Laravel + Học lập trình laravel qua ví dụ Hello World, ax+b=0, Hiển thị danh sách sinh viên Video Tìm hiểu Route qua ví dụ quản lý sinh viên - Laravel Video Hướng dẫn tìm hiểu Route - Controller - View trong Laravel qua ví dụ Video Lập trình Laravel - Truyền dữ liệu từ Controller qua View - Ví dụ Hello World trong Laravel Phần 1 Video Lập trình Laravel - Truyền dữ liệu từ Controller qua View - Ví dụ Tính giai thừa trong Laravel Phần 2 Video Lập trình Laravel - Truyền dữ liệu từ Controller qua View - Ví dụ hiển thị danh sách sinh viên trong Laravel Phần 3 Tìm hiểu route + truyền dữ liệu từ controller tới view qua bài quản lý khách sạn- Lập trình Laravel Tìm hiểu route + truyền dữ liệu từ controller tới view qua bài quản lý sản phẩm - Lập trình Laravel Tìm hiểu Route - Controller - View trong Laravel Route: Giải phương trình bậc 2 (ax2 + bx + c = 0) bằng Laravel - Lập trình laravel BÀI TẬP LARAVEL CƠ BẢN - Lập Trình Laravel - Route → Controller → View QUẢN LÝ SINH VIÊN (KHÔNG DÙNG DATABASE) - Khóa học lập trình Laravel GET/POST trong Laravel Video Tìm hiểu GET/POST trong Laravel qua ví dụ nhập thông tin người dùng - Lập trình Laravel Quản lý sinh viên bằng Laravel - Lập trình Laravel Video Quản lý sinh viên bằng Laravel - Lập trình Laravel Layout - Blade Video Tìm hiểu Route - Blade (nhung css/js/photos) - cú pháp Blade - Xử lý GET/POST trong Laravel Video Hướng dẫn tìm hiểu layout trong Laravel - qua ví dụ tạo website tin tức - Lập Trình Laravel Bài Tập Học Layout thông qua clone website - Creative Theme Bootstrap Free - Lập trình Laravel Kết nối CSDL - Laravel Video Hướng dẫn tìm hiểu view, migration, seeder, db - laravel - Qua ví dụ quản lý sinh viên Video Học Laravel qua ví dụ thêm & hiển thị tài khoản người dung - DB::Insert - DB::get - Paginate - Khoá Học Laravel Tìm hiểu migration trong laravel - Lập trình laravel Chương trình quản lý điểm danh Aptech - Lập trình Laravel - Lập trình PHP/Laravel Video - Chương trình quản lý điểm danh Aptech - Lập trình Laravel - Lập trình PHP/Laravel Video Bài tập quản lý sách bằng Laravel - Full Source Code quản lý sách - Lập trình Laravel Ôn tập - Chương trình quản lý sách + danh mục sách - Lập trình PHP, Laravel Website thi trắc nghiệm lập trình Aptech - Lập trình laravel - Lập trình PHP Tạo 1 POS bán hàng cho siêu thị - Supper Market - Lập trình Laravel Video - Tạo 1 POS bán hàng cho siêu thị - Supper Market - Lập trình Laravel Video Hướng dẫn tim hiểu Pagination + model qua ví dụ quản lý sinh viên - Lập trình Laravel Tìm hiểu paginate trong laravel - Quản lý sản phẩm - Lập trình Laravel Ứng dụng Quản lý Sách trong Laravel Phân quyền - Chức năng nâng cao Video - Tìm hiểu Auth trong Laravel 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 Video API Resful Laravel - Hướng dẫn tạo API Resful bằng PHP/Laravel - Khóa học lập trình PHP/Laravel [Examination] Examination & Test + Website tra cứu luật giao thông đường bộ - Lập trình PHP - Lập trình Laravel [Examination] Bài tập ôn luyện kết thúc môn - Sử dụng Laravel + Ajax Thực Chiến: Web bán hàng Video Hướng dẫn tạo dự án super market - phần 1 - Laravel Video Hướng dẫn tạo dự án super market - phần 2- laravel Video Tạo giở hàng - học lập trình laravel qua project- Phần 3 - laravel Khóa Học Lập Trình Laravel Thực Chiến Video Source Code Dự Án - Thực Chiến Web Bán Hàng Video Phần 1 | Laravel | Web bán hàng - Giới thiệu công nghệ Video Phần 2 | Phân tích thiết kế CSDL (database) | Web bán hàng PHP/MySQL Video Phần 3 | Phân tích thiết kế CSDL (database) | Web bán hàng PHP/MySQL Video Phần 4 | Laravel | Thiết kế web bán hàng - Cài đặt dự án & Authetication & Migration CSDL Video Phần 5 | Laravel | Thực Chiến - Web Bán Hàng -Tích hợp template và chỉnh sửa trang đăng ký-đăng nhập Video Phần 6 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng Role trong dự án Video Phần 7 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng quản lý người dung trong dự án Video Phần 8 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng quản lý danh mục Video Phần 9 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng Quản lý sản phẩm Video Phần 10 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng Quản lý tin tức Video Phần 11 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng Quản lý phản hồi Video Phần 12 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng Quản lý đơn hàng Video Phần 13 | Laravel | Thực Chiến - Web Bán Hàng - Chức năng bảo mật trong dự án Video Phần 14 | Laravel | Thực Chiến - Web Bán Hàng - Trang Chủ & Phân Layout Video Phần 15 | Laravel | Thực Chiến - Web Bán Hàng - FE Trang Sản Phẩm Video Phần 16 | Laravel | Thực Chiến - Web Bán Hàng - FE Trang Tin Tức Video Phần 17 | Laravel | Thực Chiến - Web Bán Hàng - FE Trang Liên Hệ Unlisted Video Phần 18 | Laravel | Thực Chiến - Web Bán Hàng - FE Trang Chi Tiết Tin Tức Video Phần 19 | Laravel | Thực Chiến - Web Bán Hàng - FE Chi Tiết Sản Phẩm Video Phần 20 | Laravel | Thực Chiến - Web Bán Hàng - Trang giỏ hàng Video Phần 21 | Laravel | Thực Chiến - Web Bán Hàng - Trang thanh toán & hoàn thành thanh toán Video Phần 22 | Laravel | Final | Hướng dẫn cài đặt dự án từ source code mẫu
Laravel Tutorial

[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, policygate 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.

// database/migrations/create_roles_table.php Schema::create('roles', function (Blueprint $table) { $table->id(); $table->string('name'); // Admin, Librarian, Student $table->timestamps(); });

Thêm trường role_id vào bảng users:

Schema::table('users', function (Blueprint $table) { $table->unsignedBigInteger('role_id')->default(3); // Mặc định là Student $table->foreign('role_id')->references('id')->on('roles'); });

💡 Lưu ý: bạn có thể dùng Seeder để tự động thêm 3 role mặc định:

DB::table('roles')->insert([ ['name' => 'Admin'], ['name' => 'Librarian'], ['name' => 'Student'], ]);

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ò:

php artisan make:middleware RoleMiddleware

Trong file app/Http/Middleware/RoleMiddleware.php:

namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class RoleMiddleware { public function handle($request, Closure $next, ...$roles) { if (!Auth::check()) { return redirect('login'); } if (!in_array(Auth::user()->role->name, $roles)) { return redirect('/')->with('error', 'Bạn không có quyền truy cập!'); } return $next($request); } }

Đăng ký middleware trong app/Http/Kernel.php:

protected $routeMiddleware = [ 'role' => \App\Http\Middleware\RoleMiddleware::class, ];

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:

use App\Http\Controllers\BookController; use App\Http\Controllers\CategoryController; use App\Http\Controllers\OrderController; Route::get('/', [LandingPageController::class, 'index']); // Public // Admin Route::middleware(['auth', 'role:Admin'])->group(function () { Route::get('/admin/categories', [CategoryController::class, 'index']); Route::get('/admin/books', [BookController::class, 'index']); }); // Librarian Route::middleware(['auth', 'role:Admin,Librarian'])->group(function () { Route::get('/orders', [OrderController::class, 'index']); Route::get('/orders/create', [OrderController::class, 'create']); }); // Student Route::middleware(['auth', 'role:Student'])->group(function () { Route::get('/my-books', [BookController::class, 'myBooks']); });

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:

php artisan make:policy BookPolicy --model=Book

Trong BookPolicy.php:

public function update(User $user, Book $book) { return $user->role->name === 'Admin' || $user->id === $book->created_by; } public function delete(User $user, Book $book) { return $user->role->name === 'Admin'; }

Đăng ký Policy trong AuthServiceProvider:

protected $policies = [ Book::class => BookPolicy::class, ];

Trong Controller hoặc View, bạn chỉ cần gọi:

$this->authorize('update', $book);

Hoặc trong Blade:

@can('delete', $book) <button>Xóa</button> @endcan

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:

protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'role_id' => 3, // Student ]); }

Nếu là admin tạo tài khoản, bạn có thể thêm select box để chọn role:

<select name="role_id"> <option value="1">Admin</option> <option value="2">Librarian</option> <option value="3">Student</option> </select>

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.

@if (Auth::user()->role->name == 'Admin') <a href="/admin/dashboard">Trang quản trị</a> @elseif (Auth::user()->role->name == 'Librarian') <a href="/orders">Quản lý mượn sách</a> @else <a href="/books">Xem sách</a> @endif

Bạn cũng có thể sử dụng Blade directive tùy chỉnh để code gọn hơn:

Blade::if('role', function ($roles) { return in_array(Auth::user()->role->name, explode(',', $roles)); });

Sau đó dùng trong view:

@role('Admin,Librarian') <a href="/admin/books">Quản lý sách</a> @endrole

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

  1. 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ì.

  2. 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.

  3. 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:

    composer require spatie/laravel-permission
  4. 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:

php artisan make:middleware RoleMiddleware

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!



Đăng nhập để làm bài kiểm tra

Chưa có kết quả nào trước đó

×