Tag Archive Access

Byphunsanit

YII2 : RBAC สมาชิก กลุ่มและสิทธิ

yii2 มีระบบจัดการสิทธิต่างๆ เรียกว่า Role Based Access Control (RBAC) โดยสามารถกำหนดสิทธิได้โดยใช้ กลุ่ม (role) และกำหนดสิทธิให้รายคนได้ เพื่อที่จะควบคุมให้แต่ละคนสามารถเข้าไปใช้เมนูต่างๆ ได้ตามความเหมาะสม เราคงไม่ต้องการให้ใครก็ได้ แต่มาเปลี่ยนข้อมูล ตั้งค่าของระบบใหม่ หรือลบงานของคนอื่นออกไปโดยไม่มีเหตุอันควร เริ่มจากการกำหนด role โดย

  1. เพิ่ม component authManager ในไฟล์ common/config/main.php
    main.php
    1
    2
    3
    4
    5
    6
    7
        'components' => [
    ...
            'authManager' => [
                'class' => 'yii\rbac\DbManager',
            ],
    ...
        ],
  2. สร้างตาราง auth ก่อนโดย command
    terminal
    1
    yii migrate –migrationPath=@yii/rbac/migrations/

    ตอบ yes รอจนเห็น Migrated up successfully. จะเป็นการสร้างตาราง auth_assignment, auth_item, auth_item_child และ auth_rule
    ถ้าเห็น Exception ‘yii\base\InvalidConfigException’ with message ‘The configuration for the “user” component must contain a “class” element.’ ให้ไป comment config ทีระบุ user components ออกไปก่อน แลัวลองใหม่

  3. สร้างไฟล์ใหม่ /backend/controllers/RbacController.php
    RbacController.php
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?php
    namespace backend\controllers;
     
    use Yii;
    use yii\helpers\Html;
    use yii\web\Controller;
     
    /**
     * Site controller
     */
    class RbacController extends Controller
    {
     
        private $auth = [];
     
        public function init()
        {
            parent::init();
     
            $this->auth = Yii::$app->authManager;
        }
     
        public function actionIndex()
        {
            return '<h1>RBAC Snippets</h1>' .
            '<ul>' .
            '<li>' . html::a('Create Role', 'createparentsrole', ['target' => 't1']) . '</li>' .
            '<li>' . html::a('Set Child Role', 'childrole', ['target' => 't2']) . '</li>' .
            '<li>' . html::a('Assign To User', 'assignrole', ['target' => 't3']) . '</li>' .
                '</ul>';
        }
     
        public function actionAssignrole()
        {
            $administratorsRole = $this->auth->getRole('administrators');
            if (is_null($this->auth->getAssignment('administrators', 1))) {
                $this->auth->assign($administratorsRole, 1);
            }
     
            $staffsRole = $this->auth->getRole('staffs');
            if (is_null($this->auth->getAssignment('staffs', 1))) {
                $this->auth->assign($staffsRole, 1);
            }
     
            /*
            show all roles from table auth_assignment
             */
            return '<h1>Assignments of user id = 1</h1>' .
            '<pre>' . print_r($this->auth->getAssignments(1), true) . '</pre>';
        }
     
        public function actionChildrole()
        {
            $administratorsRole = $this->auth->getRole('administrators');
            $guestsRole = $this->auth->getRole('guests');
     
            if (is_null($this->auth->hasChild($administratorsRole, $guestsRole))) {
                $this->auth->addChild($administratorsRole, $guestsRole);
            }
     
            /*
            show all roles from table auth_item_child
             */
            return '<h1>Children of "administrators" Role</h1>' .
            '<pre>' . print_r($this->auth->getChildren('administrators'), true) . '</pre>';
        }
     
        public function actionCreateparentsrole()
        {
            $roles = [
                'administrators',
                'guests',
                'staffs',
                'users',
            ];
     
            foreach ($roles as $role) {
                if (is_null($this->auth->getRole($role))) {
                    $newRole = $this->auth->createRole($role);
     
                    $newRole->description = 'parent role of ' . $role;
     
                    $this->auth->add($newRole);
                }
            }
     
            /*
            show all roles from table auth_item (type = 1)
             */
            return '<h1>Lists Of All Roles</h1>' .
            '<pre>' . print_r($this->auth->getRoles(), true) . '</pre>';
     
        }
     
    }

    ลองเรียก link http://localhost/advanced/backend/web/rbac และดูความเปลี่ยนแปลงตามลำดับ

ดูเพิ่มเติม