نوشتن متد اعتبار سنجی و تعیین سطح دسترسی

[right]سلام

من تازه کار با فریم ورک

yii

رو شروع کردم. واز اینکه یه سوال ابتدایی میپرسم معذرت میخوام.

من یه کلاس مدل به اسم

user

دارم . و میخوام توی تابع

rules

از اون

برای اعتباری سنجی فیلدی به اسم

name

از یه تابع اعتبارسنجی که خودم تعریف کردم استفاده کنم. مثل زیر

array(‘name’, ‘fun’)

و حالا اومدم تابع رو به شکل زیر تعریف کردم

public function fun($name){		


	if($this->name =='demo')


	return true;


	


	else


	return false;

{

اما متاسفافه در هر حالت این تابع مقدار صحیح برمیگرداند و انگار نوشتن این تابع هیچ اثری نداره. میشه راهنماییم کنید و بهم بگید چطور میتونم یه تابع درست بنویسم.[/right].

Do like this -

your rules -


array('name', 'examplefun', 'on' => 'your_scenario')

your examplefun -


public function examplefun($attribute, $params){


   if($this->name != 'demo')

      $this->addError($attribute, 'Name is incorrect.');

}

[right]خیلی ممنون از پاسخی که دادید.

حالا میتونم بپرسم که تعیین سطح دسترسی در

yii

به چه صورت هست؟؟

یعنی یه مثال میخوام که بهم نشون بده چطور میشه یه

Roles

تعریف کرد و برای اون سطح دسترسی داشت؟؟

مثلا میخوام یه

Roles

به اسم

userhighLevel

تعریف کنم و برای اون یه سطح دسترسی تعریف کنم.

array(‘allow’,

  'actions'=>array('admin','delete'),								


  'users'' => array('userLowLevel'),

ایا اصلا میشه چنین کاری کرد؟؟

[/right]

[right][rtl][font="Tahoma"]

سلام

برای یادگیری سیستم سطح دسترسی ها در Yii این قسمت از راهنمای فرمورک رو مطالعه کنید:

Role Based Access Controll

اگر پس از مطالعه این بخش سوالی پیش اومد بفرمایید

[/font][/rtl][/right]

[rtl][font="Tahoma"]تعیین سطح دسترسی چند روش داره که من روش عبارت های PHP رو توضیح میدم. توی کنترلر دو متد filters و accessRules به صورت زیر اضافه کنید:[/font][/rtl]




public function filters()

{

   return array(

      'accessControl',

      'postOnly + delete',

   );}

public function accessRules()

{

   return array(

      array('allow',

         'actions'=>array('index','view'),

         'users'=>array('*'),

      ),

      array('allow',

         'actions'=>array('create','update','admin','delete'),

         'users'=>array('@'),

         'expression'=>'isset($user->role) && (($user->role==="ad") || ($user->role==="au"))'

      ),

      array('deny',

         'users'=>array('*'),

      ),

   );

}



[rtl][font="Tahoma"]مهمترین قسمت در کد بالا عبارت expression هست که به کمک اون میتونید یک یا چند شرط دسترسی تعیین کنید. مثلاً در کد بالا دسترسی به اکشن های index و view برای عموم آزاد هست اما دسترسی به اکشن های create ، update ، admin و delete تنها برای کاربرانی هست که اولاً لاگین کرده باشن و ثانیا نقش اونها (role) مدیر (ad) یا نویسنده باشه (au). شما می تونید به دلخواه شرط موردنظر خودتون رو بنویسید.

البته دقت داشته باشید که role جزئی از کامپوننت user نیست بلکه من خودم اون رو توسط متد setState مربوط به کامپوننت UserIdentity اضافه کردم. کامپوننت UserIdentity توی مسیر protected/components هست. اینم نمونه کد این کامپوننت:[/font][/rtl]




class UserIdentity extends CUserIdentity

{

   private $_id;

   

   public function authenticate()

   {

      $user = User::model()->findByAttributes(array('username'=>$this->username));

      if ($user === null) {

         $this->errorCode=self::ERROR_USERNAME_INVALID;

      }

      elseif($user['password'] !== $this->password) {

         $this->errorCode=self::ERROR_PASSWORD_INVALID;

      }

      else

      {

         $this->errorCode=self::ERROR_NONE;

         $this->setState('role', $user->role);

         $this->_id = $user->id;

      }

      return !$this->errorCode;

   }

   

   public function getId()

   {

      return $this->_id;

   }

}