Rbac nâng cao với globalAccess trong yii2

0
689

Ở bài viết này mình sẽ diễn dải đến với các bạn các mục

  • Lý do dùng globalAccess
  • Cách cấu hình globalAccess

1 Lý do dùng globalAccess

Rbac phân quyền theo kiểu như bài trước rồi sao cần phân quyền rbac nâng cao .Lý do chính là chúng ta không thể kè kè đi phân quyền từng controller 1 kiểu farmer quá .Kiểu mỗi controller bạn lại tạo function behaviors() vừa không sạch code ,nếu đưa đoạn code cho quản lý chắc chắn sẽ đánh giá chúng ta không tốt .

2 Cách cấu hình globalAccess

Bước 1 : Vào folder \common\behaviors tạo 1 file tên là GlobalAccessBehavior.php .File GlobalAccessBehavior của mình như sau bạn có thể tham khảo và viết lại theo ý bạn

<?php
namespace common\behaviors;
use yii\base\Behavior;
use yii\base\Controller;
use Yii;

/**
 * Class GlobalAccessBehavior
 * @package common\behaviors
 */
class GlobalAccessBehavior extends Behavior
{

    /**
     * @var array
     * @see \yii\filters\AccessControl::rules
     */
    public $rules = [];

    /**
     * @var string
     */
    public $accessControlFilter = 'yii\filters\AccessControl';

    /**
     * @var callable a callback that will be called if the access should be denied
     * to the current user. If not set, [[denyAccess()]] will be called.
     *
     * The signature of the callback should be as follows:
     *
     * ~~~
     * function ($rule, $action)
     * ~~~
     *
     * where `$rule` is the rule that denies the user, and `$action` is the current [[Action|action]] object.
     * `$rule` can be `null` if access is denied because none of the rules matched.
     */
    public $denyCallback;

    /**
     * @return array
     */
    public function events()
    {
        return [
            Controller::EVENT_BEFORE_ACTION => 'beforeAction'
        ];
    }

    public function beforeAction()
    {
        Yii::$app->controller->attachBehavior('access', [
            'class' => $this->accessControlFilter,
            'denyCallback' => $this->denyCallback,
            'rules'=> $this->rules
        ]);
    }
}

Ok giờ đến lúc cấu hình trong globalAccess trong file main.php ở backend/config chúng ta sẽ rút gọn đi rất nhiều .Ví dụ dưới đây bạn sẽ thấy mọi thứ thật đơn giản .Nếu bạn muốn cấu hình ở file backend thì cũng làm tương tự nhé

'as globalAccess'=>[
				'class'=>'\common\behaviors\GlobalAccessBehavior',
				
				'rules'=>[
					[
		                'controllers'=>['test'],
		                'allow' => true,
		                'roles' => ['@'],
		                'actions'=>['index']
            		],
		            [
		                'controllers'=>['site'],
		                'allow' => true,
		                'roles' => ['@'],
		                'actions'=>['logout']
		            ],
		            [
		                'controllers'=>['site'],
		                'allow' => true,
		                'roles' => ['?', '@'],
		                'actions'=>['error']
		            ],
					[
						'controllers'=>['site'],
						'actions'=>['login'],
						'allow' =>TRUE,
						'roles'=>['?'],
					]
						
				]
		],

Lưu ý phần này đặt ngang hàng với phần component nhé .Vậy là được rồi đó bạn có thể truy

cập vào backend và xem nhé .Nếu yêu cầu đăng nhập vào mới xem được controller test thì khi bạn chưa đăng nhập vào khi truy cập controller test bạn sẽ bị nhảy vào mục site/login

Vậy là bạn đã nắm được những thứ cơ bản về rbac .Bạn có thể tùy ý biến tấu theo ý mình nhé .Nếu cảm thấy hay hãy chia sẻ với bạn bè và comment lại ý kiến của bạn để chúng ta có thể trao đổi nhé