SRBAC merupakan sistem module pada yii yang dibuat spyros untuk mengatur hak akses pada aplikasi. Sistem ini memiliki graphical web interface yang memudahkan kita untuk mengaturnya, sehingga user sama sekali tidak perlu mengkoding untuk mengatur hak akses. easy isn’t it?
Nah, di sini ada beberapa case yang menurut gw jadi permasalahan dan butuh sedikit work-around untuk mengatasinya. Seperti themes, themes pada srbac dia mengambil dari themes bawaan Yii, sehingga ketika anda merubah themesnya dengan themes yang ada diluar folder protected, dan ketika membuka srbac, tampilannya jadi berubah, rada2 ga enak sih sebenarnya…apalagi kalo menggunakan srbac sebagai core dari aplikasi kita.
Berikut solusi untuk masalah di atas
//dapatkan path dari themes yang sedang digunakan
$fullPath=Yii::app()->theme->getViewPath();
//path dipecah sehingga akan menghasilkan
//kurang lebih seperti ini: /themes/current_themes/views
$layout=substr($fullPath,strpos($fullPath,'themes'));
//replace string / menjadi \\
if (strpos($layout,'\\')){
$layout=str_replace('\\','/',$layout);
}
//disini ditentukan layout yang digunakan srbac
$this->layout='/'.$layout.'/layouts/main';
Lalu case lainnya, yang gw temui belakangan adalah ketika anda menentukan sebuah perlakuan terhadap action, (misalnya actionIndex hanya bisa diakses oleh role tertentu), ketika action tersebut memiliki parameter(actionIndex($p)) parameter, maka action tersebut tidak akan bisa diakses. Anda akan mendapatkan pesan kesalahan sebagai berikut:
Error:403 ‘You are not authorized for this action’
Error while trying to access /page/index.
tapi ketika anda masuk ke file allow.php yang ada di dalam module srbac dan merubah ’PageIndex($p)’ , menjadi ‘PageIndex’ saja, maka akan berjalan normal. Hal ini akan menjadi masalah, karena yang tersimpan di dalam srbac adalah PageIndex$p.
Permasalahan yang terjadi adalah ketika beforeAction di dalam file SBaseController.php melakukan validasi, data yang diterima tidak match dengan data yang tersimpan. Misalnya data yang diterima seharusnya PageIndex$p, yang diterima dan kemudian dibandingkan dengan data yang ada pada srbac hanya PageIndex. Sehingga munculah error di atas. Untuk mengatasinya anda bisa menambahkan kode dibawah untuk mengatasinya, kode di bawah ini diletakkan di file SBaseController.php di module srbac di dalam folder components pada method beforeAction setelah baris $access = $mod . $controller . ucfirst($this->action->id). Berikut kodenya:
if (count($this->actionParams) > 0){
$keys=array_keys($this->actionParams);
foreach($keys as $key){
$query=$query.','.'$'.$key;
}
$query=substr_replace($query, '',0,1);
$access=$access.$query;
}