[Yii Framework] Menu Dinamis dengan RBAC menggunakan Rights Extension

Sebelumnya saya pernah posting tentang penggunaan Rights extension disini. Walau sama-sama digunakan untuk pengaturan hak akses user, tapi menggunakan RBAC dan menggunakan cara manual yang kita buat sendiri cukup berbeda. Dengan RBAC, kita dapat menanamkan lebih dari 1 buah level pada seorang user. Juga dapat menanamkan hak akses seorang user langsung kepada suatu action yang dituju sehingga ini dapat jauh lebih efektif dibandingkan membuat nya tanpa RBAC.

Okeh, sekarang yang jadi permasalahan adalah jika saya ingin membuat sebuah menu dinamis pada RBAC dengan Rights seperti kasus ini. Semisal jika yang login adalah user yang memiliki level ‘Moderator’, maka menu nya akan muncul dan jika bukan moderator maka tidak muncul. Untuk itu, kita dapat membuat nya seperti berikut :

Buatlah sebuah fungsi tambahan pada modules rigths kita di “protected/modules/rights/componenst/RWebUser.php” seperti berikut :

 public function isRole($roleParam)
 {
     $allroles=Rights::getAssignedRoles($this->id);

     foreach ($allroles as $ii)
     {
          if($ii->name==$roleParam)
          return true;
     }
     return false;
 }

Fungsi di atas digunakan untuk mengetahui apakah seorang user yang sedang login memiliki level role dari parameter $roleParam. Jadi misal kita memanggil fungsi “Yii::app()->user->isRole(‘Moderator’)” berarti kita ingin mengecek apakah user yang sedang login saat ini memiliki tipe moderator atau tidak. Maka dari itu ketika membuat menu, kita bisa tambahkan code berikut untuk memastikan suatu menu tersebut hanya dapat dilihat oleh user yang memiliki level “Moderator”:

 array('label'=>'naamaMenu', 'url'=>array('/site/login'),'visible'=>Yii::app()->user->isRole('Moderator')&&!Yii::app()->user->isGuest),

Dengan begitu menu tersebut hanya akan muncul jika aplikasi kita di akses oleh orang yang sudah login dan memiliki level role ‘Moderator’. Tidak hanya itu, kita juga dapat menampilkan menu yang memang dapat diakses oleh seorang user. Misal, saya ingin menampilkan link menu yang mengarah ke halaman “User/admin”. Saya tidak tahu user dengan level apa saja yang dapat mengakses “User/Admin”. Karena tidak mau repot, saya ingin sistem secara otomatis harus menampilkan menu tersebut hanya kepada orang-orang yang memang diizinkan mengakses menu tersebut saja. Maka kita dapat membuat menu sebagai berikut :

 array('label'=>'User Admin', 'url'=>array('/user/admin'), 'visible'=>Yii::app()->user->checkAccess('User.Admin')),

Pada code di atas dapat kita lihat menu tersebut akan visible kepada user yang diizinkan mengakses action “User.Admin” saja. Dengan cara begitu kita tidak perlu repot mencari tahu siapa saja yang diizinkan mengakses suatu menu..

Menarik bukan??

Selesai… Selamat mencoba..

Semoga membantu.. 🙂