[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.. ๐Ÿ™‚

12 Responses to [Yii Framework] Menu Dinamis dengan RBAC menggunakan Rights Extension

  1. vjrhcr says:

    Thanks gan atas sharing nya ๐Ÿ™‚

    works nicely!! (shakehand)

    menurut ane ekstensi ini cukup powerfull buat tipe user yang bermacam-macam & dinamis.

    Regards.

  2. Jupri Abd says:

    Mantap om. Padahal ane ga kebayang kalo bisa digunain kaya gitu ๐Ÿ˜€

    Terima kasih udah sharing ๐Ÿ˜€

  3. nur ichsan says:

    bit mau tanya tintang validasi form..

    misalni ada inputan tanggal atau yg lainnya.. nah pada saat format tanggal tidak sesuai atau kosong maka form itu akan berwarna merah kayak pas login itu bit..

    di login kan kalo input username dan password salah muncul merah pada form nya,,

    thansk

  4. adi says:

    mas kalo menu nya dinamis gmn ya?saya pake mbmenu dengan memakai fungsi yang ada di blog mas ini.

  5. adi says:

    jadi buat visible menu nya berdasarkan hak akses nya gan.
    kan saya pake fungsi ini di model menu nya.

    public function getMenu($cnd=” IS NULL”)
    {
    $data2 = array();
    $data2[] = array(‘label’=>’Beranda’, ‘url’=>array(‘/site/index’));
    foreach($this->findAll(‘parent’.$cnd) as $m)
    {
    $row=array();
    $row[‘label’] = $m->nama_menu;
    $link=$m->url;
    $row[‘url’] = array($link);
    if(count($this->getMenu2(‘ =’.$m->id_menu))>0)
    {
    $row[‘items’] = $this->getMenu2(‘ =’.$m->id_menu);
    }
    $data2[] =$row;
    }
    $data2[] = array(‘label’=>’Logout (‘.Yii::app()->user->name.’)’, ‘url’=>array(‘/site/logout’),
    ‘visible’=>!Yii::app()->user->isGuest);
    return $data2;
    }

    buat nambahin visible gmn ya? saya udah coba di petain menu nya berdasarkan hak akses tpi malah jadi hilng semua gan.

    • dari postingan saya di atas agan bisa liat saya ngeset visible nya kan…
      misal : array(‘label’=>’naamaMenu’, ‘url’=>array(‘/site/login’),’visible’=>Yii::app()->user->isRole(‘Moderator’)&&!Yii::app()->user->isGuest)

      nah, visible itu di tarok di yang fungsi agan paling bawah itu gan..
      cuma kalo menu dinamis nya beda2 kasus nya susah gan.. minimal dia harus satu kasus atau udah ada pola nya…

  6. adi says:

    gmn gan?tolong gan..tolongg

  7. dewi says:

    slider pada http://sirusa.bps.go.id/index.php?r=site/index itu pake extension apa yh.. itukan bukan gambar..

  8. ade says:

    mas, user i luar sistem biar gak di arahkan ke login untuk mengakses menubar yang udh ada rolenya gmn ya ?

Leave a comment