Kiểm soát người dùng truy cập vào ứng dụng và điều khiển việc truy cập của họ là vấn đề quan trọng giúp ứng dụng an toàn hơn. Trong Yii2, AccessControl là một đối tượng được tạo ra để kiểm soát việc ủy quyền từ người dùng và xác định xem người dùng có được phép truy cập vào hành động được yêu cầu hay không.

Bộ lọc kiểm soát truy cập

AccessControl Filter hay ACF là bộ lọc kiểm soát việc các truy cập của người dùng có nằm trong danh sách cho phép hay không. Dưới đây là đoạn mã ACF kiểm soát truy cập

use yii\web\Controller;
use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'only' => ['login', 'logout', 'signup'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
    // ...
}

Trong đoạn mã trên, ACF được khai báo trong hàm behaviors() của SiteController. Thành phần only sẽ chỉ các các action cụ thể trong controller được áp dụng cho việc lọc các truy cập từ người dùng. Tất cả các action khác trong controller sẽ không phụ thuộc vào kiểm soát truy cập. Thành phần rules sẽ liệt kê các quy tắc hay luật khi truy cập vào SiteController như sau:

 - Cho phép tất cả người dùng (chưa được xác thực) truy cập được vào action login và signup. Thành phần roles sẽ  chứa một dấu hỏi ? là một đặc biệt dấu hiệu đại diện cho "guest" (Guest tức là các đồng code chưa login chưa auth gì cả đó).

 - Cho phép người dùng đã xác thực truy cập vào  action logout. Roles sẽ chứa ký tự là một mã thông báo đặc biệt khác đại diện cho "người dùng được xác thực".

ACF thực hiện kiểm tra ủy quyền bằng cách kiểm tra các quy tắc truy cập hay rules lần lượt từ trên xuống dưới cho đến khi tìm thấy quy tắc phù hợp với ngữ cảnh thực thi hiện tại. Thành phần allow sẽ được sử dụng để xem xét người dùng được phép hay không. Nếu không có quy tắc nào phù hợp, điều đó có nghĩa là người dùng KHÔNG được ủy quyền và ACF sẽ ngừng thực hiện hành động tiếp theo.

Khi ACF xác định người dùng không được phép truy cập vào action hiện tại, nó sẽ thực hiện các biện pháp sau theo mặc định:
- Nếu người dùng là khách (Guest), nó sẽ gọi yii \ web \ User :: loginRequired () để chuyển hướng trình duyệt của người dùng đến trang đăng nhập.

- Nếu người dùng đã được xác thực, nó sẽ ném ra một ngoại lệ yii \ web \ ForbiddenHttpException.

Các đồng code có thể tùy chỉnh hành vi này bằng cách định cấu hình thuộc tính yii \ filter \ AccessControl :: $ allowCallback như sau:

[
    'class' => AccessControl::class,
    ...
    'denyCallback' => function ($rule, $action) {
        throw new \Exception('You are not allowed to access this page');
    }
]

Ngoài các tùy chọn trên, AFC còn có các tùy chọn khác:

controllers: chỉ định controller mà người dùng được phép truy cập. Đây phải là một mảng, mỗi ID controller được bắt đầu bằng ID mô-đun (nếu có). Ví dụ tại hạ có 1 controller là SiteController thì khai báo sẽ là controllers => ['site'] và nếu nó đặt trong 1 module là admin thì khai báo là controllers => ['admin/site'].

[
    'class' => AccessControl::class,
    ...
    'controllers' => ['site']
]

roleParams: chỉ định các tham số sẽ được chuyển đến yii \ web \ User :: can (). Phần này liên quan đến phân quyền RBAC tại hạ sẽ làm riêng ở bài post sau =)). Đại loại là nó sẽ cho phép người dùng truy cập vào các quyền cụ thể được cấp

ips: chỉ định địa chỉ IP của ứng dụng mà người dùng được phép truy cập. Địa chỉ IP có thể chứa ký tự đại diện ở cuối sao cho khớp với các địa chỉ IP có cùng tiền tố. Ví dụ: '192.168. *' Khớp với tất cả các địa chỉ IP trong phân đoạn '192.168.'. Nếu tùy chọn này trống hoặc không được đặt, điều đó có nghĩa là quy tắc này áp dụng cho tất cả các địa chỉ IP. Ví dụ: 

[
    'class' => AccessControl::class,
    ...
    'ips' => ['172.19.37.175']
]

verbs: Xác định các phương thức truy cập GET,POST....

matchCallback : chỉ định một PHP có thể gọi được cần được gọi để xác định xem quy tắc này có nên được áp dụng hay không.

[
    'class' => AccessControl::class,
    ...
    'matchCallback' => function ($rule, $action) {
          return date('d-m') === '31-10';
    }
]

Tổng kết

Bài viết tổng hợp lại các kiến thức cơ bản để các đồng code hiểu Access Control trong Yii2 hoạt động ra sao. Trong phần này sẽ có 1 phần về phân quyền tại hạ sẽ viết ở bài post sau khi phân quyền sử dụng RBAC trong Yii2.