kanra
(Gazerock 4nevded)
July 3, 2013, 2:55pm
1
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 :
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
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
dmukadar
(Daudmukadar)
July 3, 2013, 4:02pm
2
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:
tambahin info jurusan/fakultas ke table user
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..
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..
}
kanra
(Gazerock 4nevded)
July 4, 2013, 9:02am
3
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:
tambahin info jurusan/fakultas ke table user
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..
kode itu langsung dimasukkan ke dalam useridentity?
Maksudnya kalo pake rights dibawah folder modulnya apa master?
pakai useridentity ndak bisa?
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 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
dmukadar
(Daudmukadar)
June 30, 2014, 1:38am
5
kanra:
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?
plus lanjutan pertanyaan dari dst34m
Om daut, maaf nanya lagi ya, saya skrg lagi bikin hak akses user, untuk bagian scope di atas
di letakkan di model yang mana ya? apakah di model yang bersangkutan?
kemudian untuk const itu kalau di tentukan di DB nya berarti ndak perlu mendefinisikan lg levelnya kan?
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();