Nhảy tới nội dung

Laravel access control (authorization)

Hasura extra package cung cấp sẵn cho bạn authorization system thông qua role access control, khái niệm của nó giống với Hasura, mỗi request access vào system của bạn đều phải có role kể cả unauthenticated request cũng có role.

Định nghĩa roles

Để định nghĩa roles của user bạn hãy tạo method getRoles trong Eloquent model App\Models\User:

app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
/*
* List roles of user
*/
public function getRoles(): array
{
return ['user'];
}

...
}

Method này có nhiệm vụ cung cấp set roles của user cho hệ thống, theo ví dụ trên roles fixed là ['user'] bạn có thể lưu roles trong column json hoặc tạo liên kết đến table roles tùy theo business logic của project của bạn, ví dụ lưu khi roles trên json column:

app/Models/User.php
/*
* List roles of user
*/
public function getRoles(): array
{
return $this->roles;
}

Sau khi định nghĩa xong bạn có thể xài các authorization actions thông qua Gate để check roles của user đang đăng nhập:

use Illuminate\Support\Facades\Gate;

Gate::allows('admin');
Gate::allows('manager');
Gate::allows('user');

Ngoài ra role access system còn integrate với Roles attribute của GraphQLite để bạn có thể dễ dàng check authorization của GraphQL query/mutation fields.

Inherited roles

Bạn có thể định nghĩa inherited roles giống với khái niệm inherited roles của Hasura tại auth.inherited_roles trong file config/hasura.php.

Ví dụ ta thiết lập inherited_roles như sau:

config/hasura.php
'inherited_roles' => [
'admin' => ['manager', 'user'],
],

Theo ví dụ trên, nếu user có role admin thì khi sử dụng Gate::allows('manager') hoặc Gate::allows('user') đều trả về true vì role admin được kế thừa từ role manageruser.

Roles inherited còn được hổ trợ persist state lên Hasura.

Disable access control

Nếu như bạn không muốn Hasura Extra can thiệp vào authorization system của project của bạn thì bạn có thể tắt toàn bộ tính năng mô tả ở trên thông qua option auth.enabled_role_check_method trong file config/hasura.php.

warning

Khi bạn tắt role access control system thì bạn cần implements lại logic check role, nếu không hệ thống của bạn sẽ KHÔNG bảo mật.