Hak Akses User

Misi mastah mastah Yii saya mau nanya nih, begini di aplikasi yang mau saya buat saya nemuin kesulitan dibagian hak akses user-nya.

level aktor saya :

-dosen

-asesor

-top management universitas

-top manag fakultas

-top manag jurusan

-operator univ

-operator fakultas

-operator jurusan

untuk tabel user saya seperti ini :

  • id (PK)

  • username

  • password

  • nidn (fk -> dosen)

  • id_level

nah yang saya mau tanyain itu :

  1. bagaimana cara agar operator jurusan/fakultas yang login cuma bisa melihat data dosen per jurusan/fakultas operator itu?

contoh : operator mipa hanya bisa melihat data dosen dalam lingkup fakultas mipa

  1. bagaimana cara agar top management jurusan/fakultas yang login cuma bisa melihat data dosen per jurusan/fakultas top management itu?

saya make extension rights gan, dan database-nya postgre

tolong dikasih solusi gan, saya beneran udah dikejar deadline ini :-[ :-[ :-[

kalo kebutuhannya cuma itu, sebenernya gak perlu ampe pake rights segala, kalo mau pake rights mesti ngerti rbac dulu, dan fungsinya luas banget, seputar pembatasan akses.

kalo emang dikejar waktu, ente bisa ngakalin dengan cara begini:

  1. tambahin info jurusan/fakultas ke table user

  2. waktu otentikasi kelar, simpan sekalian id_jurusan, id_fakultas dan id_level ke state (filenya: protected/components/UserIdentity, kalo pake rights ada di bawah folder modulenya). contoh:




..snip..

         else {

               $this->_id = $user->id;

               $this->setState('id_level', $user->id_level);

               $this->setState('id_jurusan', $user->id_jurusan);

               $this->setState('id_fakultas', $user->id_fakultas);

               $this->errorCode=self::ERROR_NONE;

         }

..snip..



  1. tambahkan scope di model (atau defaultScope) yg ngembalikan data sesuai id_level operator dan id_jurusan/id_fakultas.



class User extends CActiveRecord {

  const LEVEL_DOSEN=1;

  const LEVEL_ASESOR=2;  

..snip..

  const LEVEL_MAN_FAKULTAS=4;

..snip..

  const LEVEL_OPR_JURUSAN=8;

..snip..

}


class HasilAkreditasi CActiveRecord {

..snip..

   public function defaultScope()

    {

        $userLevel=Yii::app()->user->id_level;

        if (in_array($userLevel, array(User::LEVEL_MAN_JURUSAN, User::LEVEL_OPR_JURUSAN)) {

           $criteriaCondition=array('condition'=>'id_jurusan='.Yii::app()->user->id_jurusan);

        } elseif (in_array($userLevel, array(User::LEVEL_MAN_FAKULTAS, User::LEVEL_OPR_FAKULTAS)) {

           $criteriaCondition=array(

               'join'=>'JOIN table_jurusan ON id_jurusan=table_jurusan.id',

               'condition'=>'table_jurusan.id_fakultas='.Yii::app()->user->id_fakultas

            );

        } else //teruskan sendiri ya

        return array(

            $criteriaCondition;

        );

    }

..snip..

}



kode itu langsung dimasukkan ke dalam useridentity?

Maksudnya kalo pake rights dibawah folder modulnya apa master?

pakai useridentity ndak bisa?

kode itu di masukkan ke dalam model user?

permisi para master yii

ane mau tanya cara konfigurasi user rights modul supaya link buat akses operations jadi disable alias ga ditampilin buat user yang gak dikasih assigment untuk akses si operations ntu.

ane masih junior, mohon bantuannya ya para master2 yii

plus lanjutan pertanyaan dari dst34m

iya, itu dipasang pada model dengan memanfaatkan scope (cek artikel ini).

dimasukkan ke dalam model yg memerlukan filter hasil sesuai groupnya, misalnya mau nilai siswa yg direturn berdasarkan user group tertentu beda2 kriterianya, maka rule-nya dipasang di model Nilai.

kalau groupnya sudah ada di db, tidak perlu dibuat constanta, tapi scopenya dibuat lebih fleksibel, agar bisa menerima parameter berupa group id, contoh pemanggilanya:




$grup = UserGroup::model()->find('level = "dosen"'); //misal nama grup disimpan di table

$list = Nilai::model()->filterByGroupId($grup->id)->findAll();



filterByGroupId perlu ditambahkan ke scope, dengan parameter group id dipassingkan sebagai kriteria

btw, karena nama grup biasanya unique, mungkin bisa juga dibuatkan scope filter dengan parameter group name, contoh




$list = Nilai::model()->filterByGroupName('dosen')->findAll();