№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:


<?php
/**
 * Модель User
 *
 * @property integer $id
 * @property string $login
 * @property string $password
 * @property string $role
 */
class User extends CActiveRecord {
    const ROLE_ADMIN = 'admin';
    const ROLE_USER = 'user';
    const ROLE_BANNED = 'banned';
 
    public static function model($className=__CLASS__){
        return parent::model($className);
    }
 
    public function tableName(){
        return 'User';
    }
 
    protected function beforeSave()
     {
        $this->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:


JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript. O'zbekistonni rivojlantiramiz! Dasturlash orqali vatanimizni yangi marralarga olib chiqamiz.


Blogdagi so‘nggi maqolalar:


Fikrlar 2

Muzaffardjan
Muzaffardjan
Iltimos kodlarni tegini ichiga olinglar yoki ichiga yozinglar Chiroyli va qulay chiqadi
WebStyle
WebStyle
JONNY shunaqa qilib yozing. ato o'qish qiyin bovoti. huddi bloknotdan yozilganday bovoti)
Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!