№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