สำหรับบทเรียนรู้นี้เรามาสร้าง RBAC หรือ Role Base Access Control ที่มีการบันทึกลงไฟล์ PHP แทนการเก็บไว้ใน Database

RBAC มาแก้ปัญหา 1 คน 1 สิทธิ์ ซึ่งโดยปกติแล้วเวลาเก็บข้อมูลสิทธิ์ของ user นั้นทั่วไปจะกำหนด 1 คน 1 สิทธิ์ เช่น สิทธิ์ผู้ดูแลระบบ สิทธิ์ผู้ใช้งาน แต่ในความเป็นจริงในระบบที่ซับซ้อนขึ้น ผู้ใช้งานอาจมีได้หลายบทบาท ​​​​​​(Role) เช่นบทบาทหลักคืองานบัญชี แต่มีบทบาทเพิ่มเติมที่สามารถเข้าใช้งานการเบิกวัสดุ การยื่นใบลา การยืมหนังสือห้องสมุด ด้วย เป็นต้น ซึ่งแต่ละงานนั้นเราเขียนโปรแกรมเป็น modules แยกกันทำให้การจัดการการเข้าถึงยากมากๆ ทางแก้ต้องแก้ด้วย RBAC ไปลุยกัน

โดยก่อนอื่นเรามาติดตั้ง package yii2-admin เพื่อให้สะดวกต่อการกำหนดค่าต่างๆ ดังนี้

composer require mdmsoft/yii2-admin

จากนั้นกำหนดค่าให้โหลด RBAC เข้าไปใน Application ในที่นี้จะกำหนดใน backend สำหรับ yii-advanced-application โดยเปิดไฟล์ backend/config/main.php แล้วกำหนดค่าในส่วน components ดังนี้

'components' => [
        //...
        'authManager' => [
            'class' => 'yii\rbac\PhpManager',
        ],
        'as access' => [
            'class' => 'mdm\admin\components\AccessControl',
            'allowActions' => [
                'site/*',
                'admin/*', //ใช้งานครั้งแรกในการตั้งค่าต่างๆ (ห้ามใช้ใน production)
                
            ]
        ],
//...
    ],

จากนั้นเพิ่ม yii2-admin เข้าไปในส่วน modules ดังนี้

'modules' => [
        //...
        'admin' => [
            'class' => 'mdm\admin\Module',
        ],
        //...
    ],

จากนั้นสร้าง folder สำหรับเก็บไฟล์ของการสร้างสิทธิ์ต่างๆ ไว้ใน folder rbac โดยสร้างไว้ใน folder backend

backend/rbac

จากนั้นทดลองใช้งาน yii2-admin โดยเข้า url http://localhost/your-project/backend/web/index.php?r=admin จะปรากฏหน้าจอดังนี้

ก่อนอื่น ให้เราเลือกเส้นทางสำหรับการสร้าง rbac โดยเข้าไปที่ index.php?r=admin/route ในที่นี้เราได้สร้าง modules แยกแต่ละงานไว้เช่น งานบัญชีใช้ modules accounting เป็นต้น จะปรากฏหน้าจอดังนี้

จากนั้นเลือก /accounting/* เพื่อเลือก route ทั้งหมดใน accounting

เมื่อได้ เส้นทาง(route) แล้วขั้นตอนต่อไปให้สร้างสิทธิ์ (Permission) โดยเข้า url index.php?r=admin/permission จากนั้นสร้าง permission โดยกดปุ่ม create จากนั้นใส่ชื่อ pms_accounting แล้วกดปุ่ม create  แล้วให้นำเส้นทางที่เลือกไว้ใส่ใน pms_accounting ดังนี้

จากนั้นขั้นตอนถัดไปให้สร้าง Role หรือบทบาท ในที่นี้จะสร้างบทบาทชื่อ accounting โดยไปที่ url index.php?r=admin/role จากนั้นสร้าง role accounting ใส่คำอธิบายว่าบทบาทบัญชี แล้วเลือก pms_accounting มาไว้ในบทบาทนี้

จากนั้นกำหนดบทบาท (role) ให้กับ user โดยเข้าไปที่ url index.php?r=admin/assignment หรือหน้าแรกของ yii2-admin นั่นเอง

โดยคลิกที่รูปตา ของผู้ใช้งานที่ต้องการกำหนดสิทธิ์ จากนั้นสามารถกำหนดบทบาทให้กับผู้ใช้งานได้เลย ในที่นี้จะกำหนดให้ username WF013 เป็น role accounting

เป็นอันเสร็จเรียบร้อยสำหรับการสร้าง RBAC และการ assign บทบาทให้กับผู้ใช้งาน

จะเห็นว่าใน backend/rbac จะมีไฟล์ php เกิดขึ้น assignments.php และ items.php

ขั้นตอนถัดไปเป็นการ ซ่อน/แสดงเมนูตามบทบาท โดยแก้ไขส่วนของ Nav ใน backend/views/layouts/main.php ซึ่งเป็น layout หลักของ application โดยใช้การตรวจสอบผ่าน method can() ของ user 

Yii::$app->user->can('accounting')

 

ดังนี้ 

<body>
<?php $this->beginBody() ?>
<?php
NavBar::begin([
    'brandLabel' => Html::img(Yii::getAlias('@web') . '/img/logo.png', ['class' => 'img-responsive', 'width' => 58]),//Yii::$app->name,
    'brandUrl' => Yii::$app->homeUrl,
    'options' => [
        'class' => 'navbar-default navbar-fixed-top', //
    ],
]);
$menu = [
    
    ['label' => 'เกี่ยวกับ', 'url' => ['/site/about']],
    ['label' => 'Contact', 'url' => ['/site/contact']],
];
if (Yii::$app->user->isGuest) {
    //$menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
    $menu[] = ['label' => 'Login', 'url' => ['/site/login']];
} else {

    

//Accounting
    if (Yii::$app->user->can('accounting')) {
        $menu[] = ['label' => 'Accounting', 'url' => ['/accounting'], 'items' => [
            ['label' => '<span class="glyphicon glyphicon-btc"></span> Dashboard', 'url' => ['/accounting/default/index']],
            ['label' => '<span class="glyphicon glyphicon-list-alt"></span> General Ledger', 'url' => ['/accounting/account-general-ledger/index']],
            ['label' => '<span class="glyphicon glyphicon-list"></span> Report', 'url' => ['/accounting/report/index'],
                'items' => [
                    ['label' => 'Accounting and Finance Status Report', 'url' => ['/accounting/report/report1']],
                    ['label' => 'Budget Control (Income & Expense)', 'url' => ['/accounting/report/report2']],
                    ['label' => 'Financial Status', 'url' => ['/accounting/report/report3']],
                ]
            ]

        ]];
    }


    
}
echo Nav::widget([
    'options' => ['class' => 'navbar-nav navbar-right'],
    'encodeLabels' => false,
    'items' => $menu,
]);
NavBar::end();
?>

 

 

 

 

 

ความคิดเห็น

หากบทเรียนรู้มีความผิดพลาดประการใด หรือมีข้อเสนอแนะกรุณาแจ้ง contact@programmerthailand.com