№4 Dars — RBAC va faylda rollar tasnifi

№4 Dars — RBAC va faylda rollar tasnifi

№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