Bagaimana cara menggunakan Access Rule di Yii?

Halo saya pemula di Yii, dan mau tanya seputar akses level

saya memiliki tabel user yang isinya

[font="Courier New"]

======================================================

id | username | password | email | level |

======================================================

1 | masadmin | masadmin | masadmin@gmail.com | 1 |

======================================================

[/font]

dengan ketentuan

level 1 hanya bisa mengerjakan admin, delete

level 2 hanya bisa update, create, view

level 3 hanya bisa update punyanya dia sendiri, view

bagaimana cara membuat access rulenya (saya pernah dengar pakai expression, tapi ga ngerti cara makenya)

mohon di bantu

mungkin seperti ini yang kamu mau?


return array(

        array('allow',

                'actions'=>array('view','update'),

                'expression'=>"$user->id==3",

        ),

        array('allow',

                'actions'=>array('update','view','create'),

                'expression'=>"$user->id==2",

        ),

        array('allow', 

                'actions'=>array('delete','admin'),

                'expression'=>"$user->id==1",

       )

);

}

Terus kalo masalah si level 3 cuman bisa update punya sendiri

itu taruh codingnya di bagian controller, di actionUpdate (mungkin)

divalidasi.

oh… gitu, saya baru tau, tapi saya masih bingung lokasi file dan cara meletakkannya.


return array(

        array('allow',

                'actions'=>array('view','update'),

                'expression'=>"$user->id==3",

        ),

        array('allow',

                'actions'=>array('update','view','create'),

                'expression'=>"$user->id==2",

        ),

        array('allow', 

                'actions'=>array('delete','admin'),

                'expression'=>"$user->id==1",

       )

);

saya simpan coding diatas ke protected/components/UserIdentity.php, tapi tetap saja belum berhasil :( , untuk akses ke databasenya sy pake ini.




    public function authenticate()

    {

        $record=User::model()->findByAttributes(array('NamaUser'=>$this->username));

        if($record===null)

            $this->errorCode=self::ERROR_USERNAME_INVALID;

        else if($record->Password!== md5($this->password))

            $this->errorCode=self::ERROR_PASSWORD_INVALID;

        else

        {

            $this->_id=$record->UserID;

			$this->username=$record->NamaUser;

            $this->errorCode=self::ERROR_NONE;

			$this->setPersistentStates(array(

                'password' => $this->password,

                // set any other user data

                //'id' => $record->UserID,

            ));

        }

        return !$this->errorCode;

    }



kalo coding diatas saya simpan di protected/controllers/UserController.php

admin hanya bisa view seperti yg lainnya, sepertinya Levelnya ada masalah. Bagaimana caranya ya?? mohon bantuannya…

kalau setiap user diassign hanya ke satu role (1-1) itu ntar bisa bikin repot,

lebih baik pake skema N-N, setiap user bisa diassign ke beberapa role,

jadi aturan validasi kayak di atas jadinya bisa jalan mulus

oh… terus kalo setiap user bisa diassign ke beberapa role, seharusnya koding di bawah ini diletakkan dimana? apakah di “protected/components/controller.php”…??? (saya bener-bener minta pencerahannya)


return array(

        array('allow',

                'actions'=>array('view','update'),

                'expression'=>"$user->id==3",

        ),

        array('allow',

                'actions'=>array('update','view','create'),

                'expression'=>"$user->id==2",

        ),

        array('allow', 

                'actions'=>array('delete','admin'),

                'expression'=>"$user->id==1",

       )

);

ya di controller,

bisa dipake untuk setiap controller kalo misalnya mau dalam satu controller ada action yg bisa dipake user, admin, atau guest sekaligus…

tapi biar gak terlalu ribet, saya biasanya usahakan satu controller itu gak usah kebanyakan rule, misalnya ada controller buat admin aja, ada yg buat guest aja, dll…

kadang kalo saya ngebikin controller yang cuman buat admin ya tinggal




///protected/components/MyAdminController.php

abstract class MyAdminController extends CController {

    public function filters()

    {

        return array(

            'accessControl',

        );

    }


    public function accessRules()

    {

        return array(

            array('allow',

                'roles'=>array('admin'),

            ),

            array('deny',

                'users'=>array('*'),

            ),

        );

    }


}



terus ya semua controller yg dipake Admin, tinggal




///protected/controllers/UserController.php

class UserController extends MyAdminController {


}



gitu aja,

lalu biar gak terlalu ribet buat ngurus2in role2 user pake extension SRBAC aja

http://www.yiiframework.com/extension/srbac/

maksud saya bukan itu om… tapi ada 2 akses user, yg pertama sebagai admin, yg kedua sebagai user dimana user ini hanya bisa CRUD sesuai namausernya/UserIDnya. solusinya gmn ya om?

aku ikutan ya! kalo mungkin itu memang bener yang dibilang masta poetra tadi!

itu ada di actionUpdate nya!




	public function actionUpdate($id)

	{

                $id = Yii:app()->user->id; // [b]ID ditentuin disini gan kan yang dibuka id dia tuh[/b]

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['TbUser']))

		{

			$model->attributes=$_POST['TbUser'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->id));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}



sori ya kalo salah! aku masih belajar juga!

sama gan… belakanganbaru kepikirian untuk ide membuat controller khusus dengan level tersendiri biar tidak berkali kali definisikan rule

paranoid takut kalo ini desaign yang salah, ternyata ane punya teman… dedengkot pula wah jadi tenang nih…

contoh kasusnya gimana,

dari atas kok kayaknya gak konsisten…

mau tanya juga dong. sama juga seputar accessRule.


        public function filters()

        {

                return array(

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

                );

        }


        /**

         * Specifies the access control rules.

         * This method is used by the 'accessControl' filter.

         * @return array access control rules

         */

        public function accessRules()

        {

                return array(

                        array('allow',  // allow all users to perform 'index' and 'view' actions

                                'actions'=>array('index','view'),

                                'users'=>array('*'),

                        ),

                        array('allow', // allow authenticated user to perform 'create' and 'update' actions

                                'actions'=>array('create','update'),

                                'users'=>array('@'),

                        ),

                        array('allow', // allow admin user to perform 'admin' and 'delete' actions

                                'actions'=>array('admin','delete','cekusage'),

                                //'users'=>array('admin',isset(Yii::app()->user->isAdmin),isset(Yii::app()->user->username)),

                                //'users'=>array('admin','isset(Yii::app()->session[\'isAdmin\'])','isset(Yii::app()->session[\'username\'])'),


                        ),

                        array('deny',  // deny all users

                                'users'=>array('*'),

                        ),

                );

        }



ini salah satu controller saya. pengen tau nih kalo misal nya untuk ‘users’=> bisa g berdasarkan session? kayak contoh diatas. soal nya kalo udah login trus expire ada error CWebUser.username not Define. trus mau tanya expression tuh gimana maksud nya? kalo misal nya deklarasi rule cuman 1 kali bisa g? soal nya di setiap controller saya semua ada access rule nya

mohon pencerahan nya

Coba pake ini. :D




array('allow', // allow admin user to perform 'admin' and 'delete' actions

 'actions'=>array('admin','delete','cekusage'),

 'expression'=>'$user->role=="admin"',

),



Jangan lupa di config class user bikin customwebuser yang ada getRole()