Khóa học Newnet Framework

Bài 3: Quản lý Admin - Permission - Module ACL

Việc xây dựng hệ thống website không thể nào thiếu đi trang quản trị admin. Để có quyền access vào, chúng ta cần phải có tài khoản. Ngoài ra, khi hệ thống scale lớn lên, cần nhiều người quản trị với những nhiệm vụ khác nhau. Để giải quyết bài toán này, module admin được ra đời.

AUTHENTICATION

Admin authen được xây dựng trên ý tưởng của laravel. Xem kỹ phần config ta có thể thấy phần khai báo guards admin và được merge vào config auth của laravel.

Các controller xử lý tương tự như Laravel UI. Chúng được kế thừa và chỉnh sửa lại một số thứ như guard hay view mà thôi.

Những phần này chúng ta xem cho biết chứ không cần phải chỉnh sửa gì cả. Đơn giản nó chỉ là đăng nhập và đăng xuất.

Lưu ý: Chúng ta cần sử dụng những middleware cho hợp lý

  • admin.auth đăng nhập vào hệ thống bằng tài khoản admin.
  • admin.can:$permission tài khoản đăng nhập cần có quyền $permission (là quyền được cấp)
  • admin.guest nếu đã đăng nhập sẽ redirect đến trang đã cấu hình
  • admin.acl middleware này dùng cho việc khai báo rút gọn trong phần menu. Thay vì phải truyền permission vào, thì nó lấy tên của route để check luôn.
  • admin.locale để chuyển đổi route theo ngôn ngữ.

Ngoài việc đăng nhập, chúng ta còn có thể quản lý các tài khoản admin khác.

AUTHORIZATION

Ngoài việc authen vào hệ thống, chúng ta cần phải có quyền truy cập vào route.

Ở đây quyền được phân làm 2 loại là admin: được quyền truy cập vào tất cả các route ( đặt biến is_admin trong model admin và check thôi ). Và permission là các quyền truy cập vào từng route được.

Những permission này mặc định lấy theo tên của route mà áp dụng middleware admin.acl, vậy nên mỗi route chúng ta cần đặt tên cho nó.

Những route mà ta khai báo riêng không theo cấu trúc resource như: 

Route::get('', [ProfileController::class, 'payment'])
            ->name('acl.admin.user.payment')
            ->middleware('admin.can:acl.admin.user.payment')

Vì ta đang sử dụng middleware admin.can để check tài khoản có quyền truy cập hay không. Trong trường hợp này chỉ có tài khoản có quyền admin (is_admin == true). Vì trong phần quân quyền không thể auto nạp quyền này vào được do không sử dụng middleware admin.acl . Do đó ta cần add thủ công bên trong Service Provider

public function registerPermissions()
{
        Permission::add('acl.admin.user.payment', 'Thanh toán');
}

function registerPermissions() đã được gọi sẵn bên trong BaseModuleServiceProvider nên chúng ta không cần khai báo gì thêm.

Chúng được nạp và lấy ra ở trang phân quyền thôi, nên chúng ta không cần lo về performance. Thông qua cơ chế autoload, và cơ chế này cũng áp dụng key - value như cách laravel nạp các file đa ngôn ngữ. Điều quan trọng là chúng ta cần khai báo tên của route sao cho chuẩn: $module.admin.$model.$action

ví dụ: acl.admin.role.index