Phần quyền bằng Rbac trong yii2 advanced

0
912

Rbac trong yii2 giúp chúng ta dễ dàng trong việc phân quyền người dùng trong hệ thống lớn .Ví dụ admin có toàn quyền ,sub có những quyền nào ,Người viết có quyền nào và người dùng có quyền nào .Hôm nay mình sẽ nói về nó rbac thần thánh trong yii2

Đầu tiên chúng ta cần tao database phân quyền rbac:

đầu tiên vào file main.php  trong console/config/ thêm authManager

return [
    'id' => 'app-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'console\controllers',
    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        // 'defaultRoles' => ['guest'],
        ],
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
    ],
    'params' => $params,
];

Sau đó chạy lệnh sau :

yii migrate --migrationPath=@yii/rbac/migrations

Và bây giờ vào database chúng ta sẽ thấy có thêm 4 bảng dữ liệu mới là :

  • auth_rule
  • auth_item_child
  • auth_item
  • auth_assignment

Vậy là ok rồi đó bạn đã vừa tao xong bảng dữ liệu phân quyền

Có bảng phân quyền rồi thì bây giờ chúng ta phải biết cách sử dụng nó vào trong code thôi .Đầu tiên chúng ta cần đến phần common/config/main.php hoặc backend/config/main.php

Thêm dòng sau vào component

return [
    // ...
    'components' => [
        // ...
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
    ],
    // ...
];

Cách dùng bạn cho vào phần rules() trong behavios() của mỗi controller .

Ví dụ sau mình sẽ cho các mình dùng RBAC sao :

<?php
namespace backend\controllers;
use yii\web\Controller;
use common\models\Article;
use yii\filters\AccessControl;

class CkeditorController extends Controller
{
	public function behaviors()
	{
		return [
				'access'=>
				[
						'class' =>AccessControl::className(),
						'rules'=>
						[
								[
									'allow' =>TRUE,
									'actions'=>['index'],
									'roles'=>['ads_view'],
								],
						]
				]
		];
	}
	public function actionIndex()
	{
		$model = new Article();
		return $this->render('index',['model'=>$model]);
	}
}

Chúng ta luôn để RBAC ở trong phần behavios() có nhiệm vụ check quyền đăng nhập vào controller này thông qua rules access .Rules access này được lấy từ component AccessControl() .Với hệ thống phân quyền này chúng ta sẽ chỉ truy cập được vào controller này khi có quyền permisson là ads_view .Nếu bạn ko có quyền ads_view  này thì bạn ko thể vào xem được

Set up quyền mặc định

Thường khi người dùng đăng kí thành viên vào web .Bạn muốn họ có 1 cái quyền cơ bản nào đó như là quyền tác giả ,quyền được xem các mục chỉ có thành viên đăng kí mới được xem ……. Khi đó chúng ta cần sử dụng 1 dòng code trong phần đăng kí để cấp quyền mặc định cho người dùng .Bạn vào phần Frontend/controllers/SiteController chỉnh actionSignup()

 public function actionSignup()
    {
        $model = new SignupForm();
        if ($model->load(Yii::$app->request->post())) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('signup', [
            'model' => $model,
        ]);
    }

Thành như sau

if ($this->validate()) {
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->save(false);

        // the following three lines were added:
        $auth = \Yii::$app->authManager;
        $authorRole = $auth->getRole('user');
        $auth->assign($authorRole, $user->getId());

        return $user;
    }

    return null;

Còn 1 cách nhanh và đơn giản hơn  đó là cho defaute ngay trong component như sau

'authManager' => [
            'class' => 'yii\rbac\DbManager',
            'defaultRoles' => ['admin', 'author'],
        ],

Bạn tham khảo và chọn ra phương pháp phù hợp với mình .Ở phần sau mình sẽ hướng dẫn phân quyền cụ thể và cách phân quyền global access nhé