Rights: Extension Yii yang Membuat Autorisasi Menjadi Gampang
January 4th, 2012, Written by: | Categories: Tutorial, Yii Framework

Dalam melakukan develop sistem kita tentunya tidak asing dengan pengaturan hak akses untuk tingkatan user yang berbeda. Misalnya, user non-login tidak bisa mengakses halaman yang dikhususkan untuk user yang login. Halaman yang dilihat user tanpa login akan berbeda dengan yang dilihat user yang sedang login.

Yii menyediakan sebuah fitur yang disebutkan sebagai Role Base Access Control yang bertujuan untuk mengatur hak akses ini sehingga developer tidak perlu capek-capek melakukan validasi di setiap halaman. Walaupun Role Base Access Control ini sangat membantu, tetapi untuk setup hak akses user di dalam Yii Framework developer jika dengan menulis code, bukanlah perkara gampang. Menulis code secara manual biasanya cenderung panjang dan melelahkan. Anda bisa melihat contoh secuil koding setup RBAC di bawah ini yang diambil dari panduan resmi Yii untuk men-setup hak akses:

$auth=Yii::app()->authManager;

$auth->createOperation('createPost','create a post');
$auth->createOperation('readPost','read a post');
$auth->createOperation('updatePost','update a post');
$auth->createOperation('deletePost','delete a post');

$bizRule='return Yii::app()->user->id==$params["post"]->authID;';
$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
$task->addChild('updatePost');

$role=$auth->createRole('reader');
$role->addChild('readPost');

$role=$auth->createRole('author');
$role->addChild('reader');
$role->addChild('createPost');
$role->addChild('updateOwnPost');

$role=$auth->createRole('editor');
$role->addChild('reader');
$role->addChild('updatePost');

$role=$auth->createRole('admin');
$role->addChild('editor');
$role->addChild('author');
$role->addChild('deletePost');

$auth->assign('reader','readerA');
$auth->assign('author','authorB');
$auth->assign('editor','editorC');
$auth->assign('admin','adminD');

Code di atas hanya perlu dijalankan sekali. Biasanya orang akan meletakkan di sebuah halaman khusus yang hanya diketahui Admin. Programmer harus menentukan user role apa bisa mengakses halaman apa. Semakin banyak halaman maka semakin banyak code yang harus ditulis. Penulis berharap kalian mendapatkan poinnya. Dikarenakan ribet, biasanya disarankan untuk menggunakan program administratif supaya proses development lebih cepat.

Rights

Rights: Extension Yii untuk Pengaturan Hak Akses

Oleh karena itu penulis ingin memperkenalkan salah satu extension Yii yang dikenal dengan nama Rights. Extension ini dibuat oleh Christoffer Niska untuk membantu developer untuk mengatur hak akses user dalam sebuah aplikasi Web berbasis Yii. Rights mampu meng-autogenerate halaman-halaman yang sudah ada, sehingga programmer tidak perlu tulis satu per satu halaman untuk mengatur hak aksesnya. Dan lebih enaknya lagi, semuanya dilakukan dengan gampang dan intuitif karena user interface-nya yang bagus dan sederhana. Rights sampai saat artikel ini diturunkan sudah mencapai 1.3.0 dan merupakan salah satu ekstensi yang paling sering di-download di Web Yii.

Berikut merupakan langkah-langkah untuk mengimplementasikan Rights ke dalam projek aplikasi Yii Anda:

1. Pertama-tama kita download Rights versi terbaru di http://www.yiiframework.com/extension/rights/

2. Ekstrak zipnya dan copy folder “rights” ke dalam /protected/modules. Jika folder “modules” tidak ada, maka buatkan secara manual.

3. Buka file protected/config/main.php kemudian tambahkan code di bagian import:

		'application.modules.rights.*', // untuk rights

		'application.modules.rights.components.*', //untuk rights

Dilanjutkan bagian modules:

		'rights'=>array(

			'install'=>true, //hapus setelah diinstall

			'userClass'=>'User', //harus sesuai nama kelas model User yang login

			'userNameColumn' =>'username',//nama field username

			'userIdColumn'=>'id', //nama field primary key-nya

		),

Dan bagian components,

	'users'=>array(

		'class'=>'RWebUser',

		...

	),

	'authManager'=>array(

		'class'=>'RDbAuthManager',

	),

4. Setelah itu buka /components/Controller.php ganti code menjadi:

class Controller extends RController

5. Pada semua controller ubah isi filters() menjadi:

public function filters()

	{

		return array(

			'Rights', // perform access control for CRUD operations

		);

	}

6. Pastikan di class UserIdentity, sudah meng-override getId(). Jika kurang paham bagaimana meng-override, bisa melihat contoh di wiki ini.

7. Pastikan sudah login sebagai superadmin. Jika aplikasi Anda masih belum membuat sistem login yang sebenarnya (secara default, Yii hanya memberikan sistem login dengan data yang diambil dari array), maka sekarang saatnya menulis code tersebut sebelum melanjutkan ke tahap berikutnya.

8. Buka halaman Rights dengan mengakses http://project-and/index.php?r=rights

9. Rights akan terbuka normal dan menampilkan interfacenya. Sekarang kembali ke /protected/config/main.php untuk menghapus atribut “install” pada Rights

'rights'=>array(
    //'install'=>true, //hapus saja...
    'userClass'=>'User', //harus sesuai nama kelas model User yang login
    'userNameColumn' =>'username',//nama field username
    'userIdColumn'=>'id', //nama field primary key-nya
),

9. Tambahkan role dengan buka tab “Roles”. Jangan lupa tambahkan satu peran khusus untuk tamu(guest).

10. Di bagian /config/main.php tambahkan di authManager:

'authManager'=>array(
	'defaultRoles'=>array('guest'), //sesuai nama tipe guest yang di-create
),

Apabila dalam proses instalsi Rights mengalami masalah, maka silahkan cek di wiki bagaimana troubleshoot Rights yang ditulis oleh penulis juga.

More about: , ,

22 Responses to “Rights: Extension Yii yang Membuat Autorisasi Menjadi Gampang”

    • Garry

      Saya belum test sendiri. Tetapi menilik code Anda… seharusnya Anda harus menulis :
      if(Yii::app()->user->checkAccess(‘Profile.ChangePassword’, $params))
      Karena saya melihat kamu sudah membuat variable $params, jadi tidak perlu lagi tulis array di checkAccess().

      Reply
  1. santoharyono

    kenapa ya,setelah login muncul error 403.mohon pencerahannya..maklum newbie

    Reply
  2. zul5555

    Kenapa saya intall dapat error ini ya.

    Alias “rights.RightsModule” is invalid. Make sure it points to an existing PHP file and the file is readable.

    Error :

    throw new CException(Yii::t(‘yii’,'Alias “{alias}” is invalid. Make sure it points to an existing PHP file and the file is readable.’,array(‘{alias}’=>$alias)));

    Reply
    • Garry

      Yang harus diperiksa:

      1. apakah penulisan nama folder “rights” sudah benar? Apakah nama foldernya huruf kecil semuanya?

      2. Apakah folder “rights” betul-betul sudah ada di dalam folder “modules” di webroot? Folder “modules” ini harus dibuat, karena Yii dari sononya tidak buatin.

      3. apakah di config/main.php sudah ada coding
      ‘import’=>array(
      ….
      ‘application.modules.rights.*’, // untuk rights
      ‘application.modules.rights.components.*’, //untuk rights
      ….
      ),

      Reply
        • Garry

          Itu menandakan Rights sudah berfungsi. Masalah itu terjadi karena Rights menganggap halaman Index tidak boleh diakses guest, maka dia redirect ke halaman Login. Ternyata halaman Login tidak boleh diakses Guest juga, maka dia redirect ke Login, dst. (itulah penyebab redirect not properly)

          Jadi solusi untuk ini adalah, kita secara spesifik mengatakan halaman site/index dan site/login itu boleh diakses siapa saja.

          coba di bawah filter() di protected/controllers/SiteController.php ditambah coding allowedActions() seperti begini:
          public function filters()
          {
          return array(
          ‘Rights’, // perform access control for CRUD operations
          );
          }

          public function allowedActions()
          {
          return ‘index, login’;
          }

          Reply
          • zul5555

            Selepas saya masukkan koding allowedActions ini :

            public function allowedActions()
            {
            return ‘index, login, logout, contact, page’;
            }

            Saya telah dapat buka web saya. Terima Kasih diatas tunjuk ajar yang sangat dihargai. dan sangat membantu.

            Cuma ada 1 lagi masalah saya apa bila saya nak buka rights tak dapat. bila saya taip : localhost/belajaryii/index.php?r=rights

            Keluar Error seperti ini :

            CHttpException

            You are not authorized to perform this action. (C:\xampp\htdocs\belajaryii\protected\modules\rights\components\RController.php:62)
            #0 C:\xampp\htdocs\belajaryii\protected\modules\rights\components\RightsFilter.php(57): RController->accessDenied()
            #1 C:\xampp\yii\framework\web\filters\CFilter.php(38): RightsFilter->preFilter(Object(CFilterChain))
            #2 C:\xampp\htdocs\belajaryii\protected\modules\rights\components\RController.php(36): CFilter->filter(Object(CFilterChain))
            #3 C:\xampp\yii\framework\web\filters\CInlineFilter.php(58): RController->filterRights(Object(CFilterChain))
            #4 C:\xampp\yii\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
            #5 C:\xampp\yii\framework\web\CController.php(291): CFilterChain->run()
            #6 C:\xampp\yii\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
            #7 C:\xampp\yii\framework\web\CWebApplication.php(282): CController->run(‘error’)
            #8 C:\xampp\yii\framework\base\CErrorHandler.php(331): CWebApplication->runController(‘site/error’)
            #9 C:\xampp\yii\framework\base\CErrorHandler.php(204): CErrorHandler->render(‘error’, Array)
            #10 C:\xampp\yii\framework\base\CErrorHandler.php(129): CErrorHandler->handleException(Object(CHttpException))
            #11 C:\xampp\yii\framework\base\CApplication.php(732): CErrorHandler->handle(Object(CExceptionEvent))
            #12 [internal function]: CApplication->handleException(Object(CHttpException))
            #13 {main}

            Kenapa dia jadi macam ni ye?

          • Garry

            Ini disebabkan kamu belum punya Administrator. Pastikan harus login sebagai Administrator untuk mengakses localhost/belajaryii/index.php?r=rights

            Jika sudah admin, tapi tetap begitu, itu artinya harus di set di Rights supaya dia mengenali Admin. Ini harus tergantung pada table User kamu. Misalnya nama field username-nya apa. Value username-nya apa kalau dia Admin.

            By default, Right mencari tabel User, dengan field “username” dan harus bernama “Admin”. Hanya user itu yang dia anggap sebagai admin yang berhak akses: localhost/belajaryii/index.php?r=rights

  3. zul5555

    Berikut adalah database user saya:

    – Table structure for table `user`

    CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(128) NOT NULL,
    `password` varchar(128) NOT NULL,
    `email` varchar(128) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

    – Dumping data for table `user`

    INSERT INTO `user` (`id`, `username`, `password`, `email`) VALUES
    (1, ‘Admin’, ‘admin’, ‘admin@example.com’),
    (2, ‘zul’, ‘zul’, ‘zul@yahoo.com’);

    Saya telah masukkan Admin pada username pertama. tetapi masih lagi error yang sama. kenapa ya? adakah table user ‘U’ dihadapannya perlu huruf besar?

    Reply
  4. Garry

    Hm, menurut saya tidak usah ganti nama table. Table seharusnya sudah benar. Kalau boleh tahu, apakah yang ditampilkan di layar jika di coding ditulis

    echo Yii::app()->user->id

    (Coding boleh ditulis di SiteController bagian index())

    Reply
    • zul5555

      Terima Kasih suadara sangat membantu, Masalah saya itu telah dapat diselesaikan dengan menambah echo Yii::app()->user->id

      Tqvm.

      Reply
  5. newbi

    mas step by stepnya gimana ya…
    saya masih bingung….
    tolong penjelasanya…
    makasih..!!!!

    Reply
  6. dini

    ini maksudnya apa mas?

    CDbException

    CDbCommand failed to execute the SQL statement: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘grup_merapi.authassignment’ doesn’t exist. The SQL statement executed was: SELECT *
    FROM `AuthAssignment`
    WHERE userid=:userid

    Reply
    • Garry

      Katanya table “authassigment” belum ada. Ada kemungkinkan kamu belum install Rights. Apakah sudah mengikuti langkah-langkah di atas semuanya?

      apakah sudah set seperti ini dulu:
      ‘rights’=>array(
      ‘install’=>true,
      ‘userClass’=>’User’,
      ‘userNameColumn’ =>’username’,
      ‘userIdColumn’=>’id’,
      ),
      dibuka dulu Rights-nya : localhost/xxx/?r=rights

      Reply
  7. ogi

    master hafid bisa bantu ga caranya buat postingan tapi tiap postingan bisa diedit sama user yang buat postingan itu sendiri… apa pake EXtension tertentu apa emang masalahnya di database

    Reply
  8. ogi

    master bisa bantu ga caranya buat postingan tapi tiap postingan bisa diedit sama user yang buat postingan itu sendiri… apa pake EXtension tertentu apa emang masalahnya di database

    Reply
  9. arMAN

    master, itu yang point 6 mksudnya gimana? ane ga pham. buka linknya tp bahasa inggris. mohon penceRAHANNTA

    Reply

Leave a Reply