تالار گفتمان nCIS.ir

نسخه‌ی کامل: خطا در AccessControl
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان

در DefaultController ماژول admin ، متد behaviors رو بصورت زیر نوشتم:

public function behaviors() {
   return [
       'access' => [
           'class' => AccessControl::className(),
           'only' => ['index','changepass','login','logout','error'],
           'rules' => [
               'actions' => ['index','login','error'],
               'allow' => true,
               'roles' => '?',
           ],
           'rules' => [
               'actions' => ['changepass','logout'],
               'allow' => true,
               'roles' => '@',
           ],
       ],
   ];
}

در فایل پیوست تصویر خطا رو قرار دادم.
دلیل ایجاد شدن این خطا چیه؟

متشکرم.
rules یک آرایه است که هر خونه از اون، خودش یه آرایه جداگانه است و داخلش actions و... رو داره:
public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['index','changepass','login','logout','error'],
            'rules' => [
                [
                    'actions' => ['index','login','error'],
                    'allow' => true,
                    'roles' => '?',
                ],
                [
                    'actions' => ['changepass','logout'],
                    'allow' => true,
                    'roles' => '@',
                ],
            ],
        ],
    ];
}
roles یک آرایه است (ایراد در کد پست اول بود که باعث شد کد پست دوم نیز دارای خطا باشد).

public function behaviors() {
   return [
       'access' => [
           'class' => AccessControl::className(),
           'only' => ['index','changepass','login','logout','error'],
           'rules' => [
               [
                   'actions' => ['index','login','error'],
                   'allow' => true,
                   'roles' => ['?'],
               ],
               [
                   'actions' => ['changepass','logout'],
                   'allow' => true,
                   'roles' => ['@'],
               ],
           ],
       ],
   ];
}
چرا بجای ریدایرکت شدن به admin/default/login، به site/login ریدایرکت میشود؟

توی کلاس yiifiltersAccessControl یه فیلد به نام user تعریف شده است که مقدار پیشفرضش همون user است.

public $user = 'user';

برای تغییر مقدار این فیلد، یه کلاس بصورت زیر تعریف میکنیم:

namespace appmodulesadmincomponents;

use Yii;
use yiibaseAction;
use yiibaseActionFilter;
use yiidiInstance;
use yiiwebUser;
use yiiwebForbiddenHttpException;
use yiifiltersAccessControl;

class AdminAccessControl extends AccessControl {

   public function init() {
       $this->user = 'admin';
       parent::init();
   }

}

در متد behaviors از کنترلر default ، بجای AccessControl از AdminAccessControl استفاده میکنیم:

public function behaviors() {
   return [
       'access' => [
           'class' => AdminAccessControl::className(),
           'rules' => [
               [
                   'actions' => ['login','error'],
                   'allow' => true,
                   'roles' => ['?'],
               ],
               [
                   'allow' => true,
                   'roles' => ['@'],
               ],
           ],
       ],
   ];
}

حالا متد behaviors بدرستی کار میکند.
چون داره با کامپوننت user کار میکنه. شما باید این شکلی بگین که از کامپوننت ادمین استفاده کنه لازم نیست یه کلاس جدید مشتق کنید - مستندات رو مطالعه کنید) :
public function behaviors() {
   return [
       'access' => [
           'class' => AdminAccessControl::className(),
           'user' => 'admin',
           'rules' => [
               [
                   'actions' => ['login','error'],
                   'allow' => true,
                   'roles' => ['?'],
               ],
               [
                   'allow' => true,
                   'roles' => ['@'],
               ],
           ],
       ],
   ];
}