Membuat User Level Access pada yii[upgrade]

Sebelum nya saya sudah pernah posting bagaimana cara nya menerapkan user level access pada yii framework disini. Nah, disini saya akan membuat cara yang berbeda. Sebenarnya cara yang saya buat hanya sedikit memodifikasi beberapa hal pada postingan sebelumnya, tapi menurut saya yang ini lebih mudah untuk di buat dan di terpakan. Okeh, pertama-tama buatlah sebuah project yii framework. Setelah itu buatlah operasi CRUD pada tabel yang anda inginkan. Lalu di folder “protected/components” buatlah sebuah file dengan nama “EWebUser.php”. Setelah isi file tersebut dengan code seperti berikut:

<?php
class EWebUser extends CWebUser{
 
    protected $_model;
 
   protected function loadUser()
    {
        if ( $this->_model === null ) {
                $this->_model = MUser::model()->findByPk( $this->id );
        }
        return $this->_model;
    }
    
    function getLevel()
    {
        $user=$this->loadUser();
        if($user)
            return $user->level;
        return 100;
    }
}

Sebelumnya, pastikan di table user anda terdapat sebuah attribut yang digunakan untuk melakukan pe-level-an. Pada project saya sendiri saya memiliki sebuah attribut “level” pada tabel MUser. Dan jangan lupa code di atas harus anda modifikasi pada bagian “MUser” menjadi sesuai dengan nama tabel user anda. Dan setelah kode di atas telah anda buat, anda dapat membuat level access user nya dengan memberikan code berikut di controller yang anda tuju tepatnya di “function accesssRule()”:

array('allow', 
		'actions'=>array('index','view','create','update','admin','delete'),
		'expression'=>'$user->getLevel()<=1',
	),

Yah, dapat anda lihat disana saya membuat “<=” pada level access nya, itu bisa diterapkan karena kita mengambil nilai integer pada “getLevel()” nya. Jadi kita bisa membuat nya denga =,<=,<,>,>= yah silahkan anda bereksperimen…

 

Selesai, selamat mencoba…

Semoga membantu😀

53 Responses to Membuat User Level Access pada yii[upgrade]

  1. Pingback: User Level Access Dinamis pada yii framework « Sabitlabscode

  2. Hito says:

    kok saya extends lalu jalanin, muncul error .. kalau CWebUser dan behaviors nya tidak mempunyai nama function getLevel() ? ada yang bisa tau kenapa begitu ?

    • di folder config/main.php
      udah ditambah ini belom gan?
      ‘class’=>’application.components.EWebUser’,

      kalo belom, coba ganti component jadi gini gan
      ‘components’=>array(
      ‘user’=>array(
      // enable cookie-based authentication
      ‘class’=>’application.components.EWebUser’,
      ‘allowAutoLogin’=>true,
      ),

  3. wah makasih banget nih gan..
    tapi yang $user->getLevel()<=1 itu dapet darimana ya gan?

  4. @hito : udah di jawab sama aga teguh..

    @teguh : nilai 1 saya dapet dari tabel yang saya miliki.. karena saya biasa membuat level dengan angka2/ key yang berelasi ke tabel level..

  5. april says:

    saya mempunyai tabel user yang berisi id_user, username, password, email dll serta foreign key untuk relasi ke tabel level yg berisi id_level, level dan deskripsi.

    saya coba codingan di atas tapi tidak berfungsi, apa ada yg salah?

    ini di EWebUser.php
    loadUser();
    if($user)
    return $user->level;
    return 100;
    }

    protected function loadUser()
    {
    if ( $this->_model === null ) {
    $this->_model = User::model()->findByPk($this->id);
    }
    return $this->_model;
    }
    }

    ini di UserController.php
    return array(
    array(‘allow’,
    ‘actions’=>array(‘index’,’view’),
    ‘users’=>array(‘*’),
    ),
    array(‘allow’,
    ‘actions’=>array(‘create’),
    ‘users’=>array(‘@’),
    ),
    array(‘allow’,
    ‘actions’=>array(‘update’,’delete’),
    ‘users’=>array(‘@’),
    ‘expression’=>’$user->getLevel()array(‘*’),
    ),
    );

    id_level saya mulai dari 11 yaitu admin..

  6. array(‘allow’,
    ‘actions’=>array(‘update’,’delete’),
    ‘users’=>array(‘@’),
    ‘expression’=>’$user->getLevel()array(‘*’),
    )

    coba lihat contoh yang saya kasih di atas mbak.. cara pengaturannya masih salah..

  7. april says:

    ada yang kurang mas, sudah saya buat seperti ini..
    tapi belum ngefek ..

    array(‘allow’, // allow admin user to perform ‘admin’ and ‘delete’ actions
    ‘actions’=>array(‘update’,’delete’),
    ‘users’=>array(‘@’),
    ‘expression’=>’$user->getLevel()<12',
    ),

  8. yang ‘users’=>array(‘@’), ilangin aja mbak..

  9. apinx says:

    mastah….
    kok punya saya eror 304 ya?

    ini script webUser :
    _model===null)
    {
    if($id!==null)
    $this->_model=User::model()->findByPk($id);
    }
    return $this->_model;
    }

    function getLevel()
    {
    $user=$this->loadUser(Yii::app()->user->name);
    if($user==null)
    return false;
    else
    return $user->level_id;
    }
    }
    ?>

    terus ini script controllernya :
    array(‘index’,’view’),
    ‘users’=>array(‘*’),
    ),
    array(‘allow’, // allow admin user to perform ‘admin’ and ‘delete’ actions
    ‘actions’=>array(‘admin’,’delete’,’create’,’update’),
    ‘expression’=>’Yii::app()->user->getLevel()==2’,
    ),
    array(‘deny’, // deny all users
    ‘users’=>array(‘*’),
    ),
    );
    }

    /**
    * Displays a particular model.
    * @param integer $id the ID of the model to be displayed
    */
    public function actionView($id)
    {
    $this->render(‘view’,array(
    ‘model’=>$this->loadModel($id),
    ));
    }

    /**
    * Creates a new model.
    * If creation is successful, the browser will be redirected to the ‘view’ page.
    */
    public function actionCreate()
    {
    $model=new Kelurahan;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST[‘Kelurahan’]))
    {
    $model->attributes=$_POST[‘Kelurahan’];
    if($model->save())
    $this->redirect(array(‘view’,’id’=>$model->kd_Kelurahan));
    }

    $this->render(‘create’,array(
    ‘model’=>$model,
    ));
    }

    /**
    * Updates a particular model.
    * If update is successful, the browser will be redirected to the ‘view’ page.
    * @param integer $id the ID of the model to be updated
    */
    public function actionUpdate($id)
    {
    $model=$this->loadModel($id);

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST[‘Kelurahan’]))
    {
    $model->attributes=$_POST[‘Kelurahan’];
    if($model->save())
    $this->redirect(array(‘view’,’id’=>$model->kd_Kelurahan));
    }

    $this->render(‘update’,array(
    ‘model’=>$model,
    ));
    }

    /**
    * Deletes a particular model.
    * If deletion is successful, the browser will be redirected to the ‘admin’ page.
    * @param integer $id the ID of the model to be deleted
    */
    public function actionDelete($id)
    {
    if(Yii::app()->request->isPostRequest)
    {
    // we only allow deletion via POST request
    $this->loadModel($id)->delete();

    // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
    if(!isset($_GET[‘ajax’]))
    $this->redirect(isset($_POST[‘returnUrl’]) ? $_POST[‘returnUrl’] : array(‘admin’));
    }
    else
    throw new CHttpException(400,’Invalid request. Please do not repeat this request again.’);
    }

    /**
    * Lists all models.
    */
    public function actionIndex()
    {
    $dataProvider=new CActiveDataProvider(‘Kelurahan’);
    $this->render(‘index’,array(
    ‘dataProvider’=>$dataProvider,
    ));
    }

    /**
    * Manages all models.
    */
    public function actionAdmin()
    {
    $model=new Kelurahan(‘search’);
    $model->unsetAttributes(); // clear any default values
    if(isset($_GET[‘Kelurahan’]))
    $model->attributes=$_GET[‘Kelurahan’];

    $this->render(‘admin’,array(
    ‘model’=>$model,
    ));
    }

    /**
    * Returns the data model based on the primary key given in the GET variable.
    * If the data model is not found, an HTTP exception will be raised.
    * @param integer the ID of the model to be loaded
    */
    public function loadModel($id)
    {
    $model=Kelurahan::model()->findByPk($id);
    if($model===null)
    throw new CHttpException(404,’The requested page does not exist.’);
    return $model;
    }

    /**
    * Performs the AJAX validation.
    * @param CModel the model to be validated
    */
    protected function performAjaxValidation($model)
    {
    if(isset($_POST[‘ajax’]) && $_POST[‘ajax’]===’kelurahan-form’)
    {
    echo CActiveForm::validate($model);
    Yii::app()->end();
    }
    }
    }

  10. gan klo artinya Property “EWebUser.getLevel” is not defined.apa ya? ini muncul ketika pakai extension mbmenu..mohon penjelasannya maklum newbie

  11. berrti agan belum definisiin di config nya kayaknya.. itu di coment atas agan saya udah kasih link..

  12. gan kalo udh ane bedain levelnya di tbl user misal 0 dan 1 tapi gak ada efeknya. misal create,update saya pakai yg 1 lalu index,view pakai 0 kok bisa di lihat semua ya

  13. berarti masih salah gan.. harus nya bisa beda gan..

  14. maksudnya salah di struktur tabel apa di mana nih gan? maklum masih newbie

  15. jadi kalo agan set dia “<=1"(kurang dari sama dengan 1) dia level 0 dan 1 pasti tetep bisa masuk gan. Kalo cuma mau 1 aja yang bisa buat nya "==1" gan..

  16. Ane buat di controller gini gan…
    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(‘@’),
    ‘expression’=>’$user->getLevel() == 0’,
    ),

    );
    }

    nilai level udah 0 smw gan tapi halaman create malah eror??
    EwebUsernya :

    protected function loadUser()
    {
    if ( $this->_model === null ) {
    $this->_model = User::model()->findByPk( $this->id );
    }
    return $this->_model;
    }

    function getLevel()
    {
    $user=$this->loadUser();
    if($user)
    return $user->level;
    return 100;
    }

  17. error ny apa gan?

  18. You are not authorized to perform this action….kalo di default lagi ke ‘users’=>array(‘@’) gk masalah

  19. itu artinya level nya dia beda dengan yang agan buat gan.. sehingga dia ga diizinin untuk ngakses action tersebut..

  20. ok docobi dulu gan…untuk tbl user level harus int apa gak ya??

  21. gak harus, tapi lebih baik int gan..

  22. function getLevel()
    {
    $user=$this->loadUser();
    if($user)
    return $user->level;
    return 100;
    }
    tanya lagi ni …kode return 100; itu maksudnya apa ya gan?

  23. vivi says:

    mas masalah saya hampir sama kaya mas Sugeng
    masih muncul error 403
    EWebUser Saya seperti ini
    class EWebUser extends CWebUser{

    protected $_model;

    protected function loadUser()
    {
    if ( $this->_model === null ) {
    $this->_model = TblUserAdmin::model()->findByPk($this->id);
    }
    return $this->_model;
    }

    function getLevel()
    {
    $user=$this->loadUser();
    if($user)
    return $user->id_level;
    return 100;
    }
    }

    Controller saya seperti ini
    return array(
    array(‘allow’, // allow admin user to perform ‘admin’ and ‘delete’ actions
    ‘actions’=>array(‘create’,’captcha’,’update’,’admin’,’delete’),
    ‘expression’=>’$user->getLevel()==1’,
    ),
    array(‘allow’, // allow all users to perform ‘index’ and ‘view’ actions
    ‘actions’=>array(‘index’,’view’),
    ‘users’=>array(‘*’),
    ),
    array(‘deny’,
    ‘users’=>array(‘*’),
    ),
    );

    saya udah coba masuk ke Create untuk yg id_level 1, tapi error 403
    saya coba pake id_level 2 pun juga error 403
    yg bisa dibuka hanya index dan view
    itu salah dimana y mas?
    mohon bantuannya mas😀

  24. @sugeng : sebagai defaul bagi orang yang nggak login mas.

    @vivi : waduh, saya juga bingung kalo bisa error gitu mbak..
    kalo udah bener harus nya dia ngikutin level nya untuk hak akses nya mbak..

  25. lovely_vee says:

    saya mau tanya donk.. kalo level itu diletakan di model berbeda, jadi returnya gimana ya? mohon percerahan.

  26. mksd ny gmana gan? itu ga di tarok di model kok level nya..

  27. lovely_vee says:

    ceritanya :
    saya punya table person ( model user ) isinya role_id user_id username, password
    table role (model role) isinya role_id role_name level_id
    relationsnya person_role

    nah kalo saya mau return level_id itu gimana caranya?

    saya uda coba
    return $user->person_role->level_id
    tapi eror.
    ada masukan lain?

  28. lovely_vee says:

    errornya Trying to get property of non-object

  29. kalo mau pake relasi pastiin relasinya udah di definisiin di model person fungsi relasi nya. Baru bisa di akses langsung dengan $user->namarelasi->level_id;
    tapi kalo ga, bisa pake manual aja Role::model()->findByPk($user->role_id)->level_id

  30. lovely_vee says:

    kalau misal relasinya lebih dari 1 bagaimana? tetep bisa $user->namarelasi_1->namarelasi_2->level_id; ?

  31. lovely_vee says:

    muncul error
    Fatal error: Can’t use method return value in write context in C:\xampp\htdocs\yii\framework\base\CComponent.php(607) : eval()’d code on line 1
    ada yang tau solusinya gimana?

  32. wah. saya ga terlalu jelas dari pesan error nya.. tapi kyak nya ada method yang salah mbak..

  33. lovely_vee says:

    errornya tetep Trying to get property of non-object. padahal semua relasi sudah didefinisikan. Ada masukan lain?

  34. kayak nya nilai yang agan ambil itu ga ada data nya mungkin.. dia mau nampilin tapi kosong.. jadi error karena dianggap bukan object..

  35. lovely_vee says:

    Sudah bisa tapi kenapa yang di return user_id terus ya? begini potongan coding saya :
    di EWebUser :
    _model === null ) {
    $this->_model = Person::model()->findByPk($this->id);
    }
    return $this->_model;
    }

    function getPrivilege()
    {
    $user=$this->loadUser();
    $user1=RolePrivilege::model()->findByPk($user->PERSON_ID);
    if($user)
    return $user1->ROLE_ID;
    else
    return 100;

    }

    }

    == harusnya kan return role_id tapi yang direturn malah PERSON_IDnya.

    ada masukan?

  36. wah. dari coding nya udah bener mbak akan ngembaliin role_id dari tabel privilege.. coba di cek lagi di databse nya mbak..

  37. lovely_vee says:

    Thanks masukannya, uda jalan. tapi saya ada masalah lain,
    seandainya role_id yang dimiliki person_id banyak, gimana cara return semua role_id yang dimiliki person_id itu?
    ada solusi?
    karena pada code diatas yang di return hanya role_id yang pertama.

  38. kalo gitu mending agan pake metode lain untuk buat level nya.. nama nya RBAC. Kalo agan mau gampang pake extension rights aja.. di blog ini udah ada yang bahas itu..

  39. luar biasa sekali infonya,sudah 2 tahun tapi ilmu anda terus bermanfaat😀 semoga saya bisa seperti anda bisa berbagi ilmu yang barokah ini…

  40. sofi says:

    kak sabit, nanya dong,,,kok aku bikin ini masih belum jalan ya,,,masih belum bisa klik manage petugas
    ini di petugascontroller

    public function accessRules()
    {
    return array(
    array(‘allow’,
    ‘actions’=>array(‘index’,’view’),
    ‘users’=>array(‘*’),
    ),
    array(‘allow’,
    ‘actions’=>array(‘create’,’update’),
    ‘users’=>array(‘@’),
    ),
    array(‘allow’,
    ‘actions’=>array(‘index’,’view’,’create’,’update’,’admin’,’delete’),
    ‘expression’=>’$user->getLevel()array(‘*’),
    ),
    );
    }
    ini di ewebuser
    _model===null){
    $this->_model=Petugas::model()->findByPk($this->id);
    }
    return $this->_model;
    }
    function getLevel(){
    $user=$this->loadUser();
    if($user)
    return $user->idlevel;
    return 100;
    }

    }

    yang di config/main sudah saya ganti kak
    ‘components’=>array(
    ‘user’=>array(
    // enable cookie-based authentication
    ‘class’=>’application.components.EWebUser’,
    ‘allowAutoLogin’=>true,
    ),

    nama tabel : petugas dengan primary key nip lalu ada atribut idlevel

    errornya pas diklik di manage/delete petugas
    Error 403

    You are not authorized to perform this action.
    mohon bantuannya kak

  41. sofi says:

    udah bisa kak,,hehe,,,makasih (:

  42. vy says:

    bang kalo mau lebih detail lagi, misalkan pegawai kabupaten(id level =3) hanya diperbolehkan melihat data yang kodekabupaten dan kode provinsinya sama kyak yg dia punya gimana bang?

  43. di atur langsung di query nya kalo gitu mbak..

  44. adekkecil182 says:

    gan,

    Property “User.isActive” is not defined.”

    itu kenapa ya gan?
    pas create user ?makasih🙂

  45. dlonra says:

    gan ane, udah coba di web ane dan error 403 saat ane akses sebagai admin (id_level = 1). Ane pikir salahnya di User::model()->findByPk($this->id); karena primary key ane id_user. Terus ane coba malah error lagi property EWebUser.id_user tidak ada. Kenapa kira-kira? Mohon pencerahannya. Terima kasih

  46. Can’t use method return value in write context in C:\xampp\htdocs\yii\framework\base\CComponent.php(612) : eval()’d code on line 1
    mas kalau gini problemnya kenapa ya? Mohon pencerahan..

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: