สำหรับบทเรียนรู้นี้เรามาสร้าง 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();
?>
ความคิดเห็น