ข้ามไปยังเนื้อหาหลัก
ProgrammerThailand

Yii Framework 2 (Yii2)

Role Base Access Control (RBAC) แบบ PhpManager

สำหรับบทเรียนรู้นี้เรามาสร้าง 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 จะปรากฏหน้าจอดังนี้

Role Base Access Control (RBAC) แบบ PhpManager

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

Role Base Access Control (RBAC) แบบ PhpManager

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

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

Role Base Access Control (RBAC) แบบ PhpManager

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

Role Base Access Control (RBAC) แบบ PhpManager

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

Role Base Access Control (RBAC) แบบ PhpManager

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

Role Base Access Control (RBAC) แบบ PhpManager

เป็นอันเสร็จเรียบร้อยสำหรับการสร้าง 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();
?>

 

 

 

 

 

ติดปัญหาตอนทำตาม? ถามในชุมชน

ความคิดเห็น (0)

ยังไม่มีความคิดเห็น — เริ่มคุยเป็นคนแรก ถามสิ่งที่สงสัย หรือแชร์ประสบการณ์ของคุณ