№4 Dars — RBAC va faylda rollar tasnifi
Qaysidir bir imkoniyatlarni foydalanuvchidan cheklash imkoni har bir katta proyekt qilinayotgan joyda muhim ro`l o`ynaydi. Misol uchun bir foydalanuvchiga izoh qo`shish imkonini beramiz lekin o`chirish imkonini bermaymiz. qaysidir foydalanuvchiga qo`shish imkonini ham o`chirish imkonini ham beramiz. Ya`ni kimlar uchundir biror bir ishni qila olish xuquqini berish va kimlar uchundir shu ishni bajara olish xuquqini bermaslik masalasi. Ana shunday imkoniyatlar Yii da RBAC tushunchasi sifatida o`zining aksini topgan.
Masalani qo`yamiz. Uchta ro`l aniqlaymiz: guest, user, admin va ro`l maydoniga mos ma`lumotlar omborida foydalanuvchilarni biriktiramiz. Keyin kirish xuquqini tekshiramiz. Birinchi ish komponentimizni sozlashimiz. Ya`ni protected/config/main.php fayldagi components qismiga ushbu kodni qo`shish:
'authManager' => array(
// O`zimizning auth managerimizdan foydalanish.
'class' => 'PhpAuthManager',
// admin va user bo`lmaganlar uchun dastlabki rolni biriktirish.
'defaultRoles' => array('guest'),
),
Undan avval bizda user jadvali mavjud bo`lishi kerak biz ishimizni shu jadval orqali amalga oshiramiz:
CREATE TABLE `user` ( `ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `employeeID` INT(10) UNSIGNED NULL DEFAULT NULL, `username` VARCHAR(30) NULL DEFAULT NULL, `password` VARCHAR(40) NULL DEFAULT NULL, `role` TEXT NULL, PRIMARY KEY (`ID`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB;
va
Insert into `user` (ID, employeeID, username, password, role) values ('', '3', 'MyTest', '123', 'admin');
Config papkasi ichida auth.php faylini yaratamiz va ushbu kodni kiritamiz:
protected/config/auth.php:
return array(
'guest' => array(
'type' => CAuthItem::TYPE_ROLE,
'description' => 'Guest',
'bizRule' => null,
'data' => null
),
'user' => array(
'type' => CAuthItem::TYPE_ROLE,
'description' => 'User',
'children' => array(
'guest',
),
'bizRule' => null,
'data' => null
),
'admin' => array(
'type' => CAuthItem::TYPE_ROLE,
'description' => 'Admin',
'children' => array(
'user', // foydalanuvchilarga berilgan xuquqning barchasi admin da ham mavjud
),
'bizRule' => null,
'data' => null
),
);
Yii::app()->user->id bizga foydalanuvchi ‘id’ sini qaytaradi. UserIdentity. Classiga o`zgartirish
kiritamiz.
protected/components/UserIdentity.php:
class UserIdentity extends CUserIdentity {
// id ni saqlidi.
protected $_id;
// Bu metod foydalanuvchi authenticate qilayotgan paytdagi birinchi murojaat
public function authenticate(){
$user = User::model()->find('LOWER(username)=?', array(strtolower($this->username)));
if(($user===null) || ($this->password!==$user->password))
{
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else {
// Identifikator sifatida id dan foydalaniladi username dan emas,
// buni qanday aniqlaymiz. Albatta getId() metodini qayta
// aniqlashimiz orqali.
$this->_id = $user->ID;
// Keyinchalik bizga login kerak bo`lamydi. Shu userning id sidan
// foydalanib ketilaveriladi. Bizning modelda username ning xaqiqiy
// nomi bor va uni biz Yii::app()->user->name orqali olamiz.
$this->username = $user->username;
$this->errorCode = self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId(){
return $this->_id;
}
}
Keyin Yii::app()->user->role foydalanib Ma`lumotlar omboridan ro`l ni olamiz. Buning uchun ushbu WebUser faylni yaratamiz va ushbu kodni yozamiz.
protected/components/WebUser.php:
class WebUser extends CWebUser {
private $_model = null;
function getRole()
{
if($user = $this->getModel())
{
// User jadvalida role ustuni bor
return $user->role;
}
}
private function getModel()
{
if (!$this->isGuest && $this->_model === null)
{
$this->_model = User::model()->findByPk($this->id, array('select' => 'role'));
}
return $this->_model;
}
}
WebUser classidan foydalanish uchun protected/config/main.php faylining components qismining ichiga ushbu kodni qo`shib qo`yish kerak:
'user'=>array(
'class' => 'WebUser', user massivi ichiga ushbu classni qo`shib qo`yish kerak.
// …
),
Eslatma:Bunday holat bilan ixtiyoriy Yii komponentini qayta aniqlash mumkin. Endi bizda ro`llar oqimi bor va biz foydalanuvchi ro`llarini bilamiz. Ularni bog`lash qoldi. Buning uchun components papkamizdagi PhpAuthManager classini hosil qilamiz.
protected/components/PhpAuthManager.php:
class PhpAuthManager extends CPhpAuthManager{
public function init()
{
if($this->authFile===null)
{
$this->authFile=Yii::getPathOfAlias('application.config.auth').'.php';
}
parent::init();
// Birinchi bor kirgan foydalanuvchini sistema Guest deb hisoblaydi.
if(!Yii::app()->user->isGuest)
{
// ro`lni bog`lash, foydalanuvchi identifikatori bilan ma`lumotlar
// omborida hosil qilinadi.
// UserIdentity.getId() orqali qaytaradi.
$this->assign(Yii::app()->user->role, Yii::app()->user->id);
}
}
}
Ilova 1: User modeli:
password = this->password;
return parent::beforeSave();
}
}
Endi tekshirish: Agar biz index.php fayliga quyidagicha kod yozsak
if(Yii::app()->user->checkAccess('admin')){
echo "Men adminman";
}
unda biz login web sahifasidagi login maydoniga «MyTest» va passwordiga «123» ni terib kirsak bizda index sahifamizda «Men adminman» degan yozuv paydo bo`ladi. Bunda jadvalimizdagi username «MyTest» ga mos role ustunidagi nom «admin» bo`lishi kerak, agarda biz ushbu ustunga «admin» o`rniga «user» deb sozsak unda ushbu «Men adminman» degan yozuv index sahifasida chiqmaydi, chunki faqat «admin» ro`lidagilar uchun bu yozuvni ko`rish xuquqi berilgan.
Manba:
Web Dasturlash
№4 Dars — RBAC va faylda rollar tasnifi