2013-02-09 4 views
0

Мне нужно обеспечить аутентификацию на всех страницах приложения YII. Для этого я расширил SiteController класс с помощью следующего кода я получил от http://www.heirbaut.nl/2010/02/23/forcing-a-yii-application-to-authenticate/:Почему Yii-принудительная аутентификация работает только на домашней странице/статических страницах?

/** 
* @return array action filters 
*/ 
public function filters(){ 
    return array(
     'accessControl', // perform access control for CRUD operations 
    ); 
} 

/** 
* Specifies the access control rules. 
* This method is used by the 'accessControl' filter. 
* @return array access control rules 
*/ 
public function accessRules(){ 
    return array(
     array('allow', // allow all users to perform 'login' 
      'actions'=>array('login'), 
      'users'=>array('*'), 
     ), 
     array('allow', // allow authenticated user to perform any action 
      'users'=>array('@'), 
     ), 
     array('deny', // deny all users 
      'users'=>array('*'), 
     ), 
    ); 
} 

Это только делает то, что он должен, перенаправить все запросы на unauthenticaed пользователей к форме входа в систему, для index.php URL. Но index.php?r=person и, следовательно, главное меню приложения обходит это ограничение и появляется независимо от аутентификации.

+2

Do у вас есть «PersonController»? – topher

+0

да. нужно ли каждому контроллеру ссылаться на тот же код? если вы говорите, что это так, конечно, больно, а создайте новый класс для наследования. но это похоже на много кодовой таблички. не могу ли я решить эту проблему выше в цепочке в Yii? – aelgoa

ответ

0

Каждый контроллер должен ссылаться на этот код. Вариант, чтобы создать свой собственный контроллер, который расширяет CController и поместить его в папку protected/components

class MyController extends CController{ 
    /** 
    * @return array action filters 
    */ 
    public function filters(){ 
     return array(
      'accessControl', // perform access control for CRUD operations 
     ); 
    } 

    /** 
    * Specifies the access control rules. 
    * This method is used by the 'accessControl' filter. 
    * @return array access control rules 
    */ 
    public function accessRules(){ 
     return array(
      array('allow', // allow authenticated user to perform any action 
       'users'=>array('@'), 
      ), 
      array('deny', // deny all users 
       'users'=>array('*'), 
      ), 
     ); 
    } 
} 

Затем в классах контроллеров, которые необходимо расширить MyController и переопределить accessRules() добавить дополнительные правила

public class SiteController extends MyController{ 

    ... 

    public function accessRules(){ 
     $rules=parent::accessRules(); 
     array_unshift($rules,array(
      'allow', // allow all users to perform 'login' 
      'actions'=>array('login'), 
      'users'=>array('*'), 
     )); 
     return $rules; 
    } 

    ... 
} 
+0

спасибо, это подтверждает мои предположения и отлично работает! – aelgoa

Смежные вопросы