[Yii Framework] Menu Dinamis dengan RBAC menggunakan Rights Extension
June 24, 2012 12 Comments
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.. ๐
Thanks gan atas sharing nya ๐
works nicely!! (shakehand)
menurut ane ekstensi ini cukup powerfull buat tipe user yang bermacam-macam & dinamis.
Regards.
Mantap om. Padahal ane ga kebayang kalo bisa digunain kaya gitu ๐
Terima kasih udah sharing ๐
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
kalo ga salah udah ada buat validasi nya mas pake “type”. Coba liat disini : http://www.yiiframework.com/forum/index.php/topic/5711-date-validation-inside-rules-method-of-model/
mas kalo menu nya dinamis gmn ya?saya pake mbmenu dengan memakai fungsi yang ada di blog mas ini.
mksd nya dimanis gmana gan? yang di postingan ini udah dinamis gan..
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…
gmn gan?tolong gan..tolongg
slider pada http://sirusa.bps.go.id/index.php?r=site/index itu pake extension apa yh.. itukan bukan gambar..
lupa saya, kalo ga salah jcarousel mbak..
mas, user i luar sistem biar gak di arahkan ke login untuk mengakses menubar yang udh ada rolenya gmn ya ?