如何在Yii框架中为不同的模块正确创建不同的登录

时间:2015-05-13 13:01:08

标签: php yii yii-components

在我的Yii 1.x应用程序中,我定义了新的Admin模块。在init模块的admin方法中,我定义了新的user组件,如下所示:

$this->setComponents(array(
            'user'=>array(
                'class' => 'CWebUser',
                // enable cookie-based authentication
                'allowAutoLogin'=>true,
                'baseUrl'=>Yii::app()->createUrl("admin/user/login"),
                'stateKeyPrefix' => '_admin',
            ),
        ));

现在,我希望我能做到以下几点:

Yii::app()->getModule("admin")->user->login($this->_identity,$duration)

Yii::app()->getModule("admin")->user->logout();

但它不起作用。

当我打印我的模块(var_dump(Yii::app()>getModule("admin")))时,我可以看到user组件未定义。

object(AdminModule)[14]
  public 'defaultController' => string 'default' (length=7)
  public 'layout' => null
  public 'controllerNamespace' => null
  public 'controllerMap' => 
    array (size=0)
      empty
  private '_controllerPath' (CWebModule) => null
  private '_viewPath' (CWebModule) => null
  private '_layoutPath' (CWebModule) => null
  public 'preload' => 
    array (size=0)
      empty
  public 'behaviors' => 
    array (size=0)
      empty
  private '_id' (CModule) => string 'admin' (length=10)
  private '_parentModule' (CModule) => null
  private '_basePath' (CModule) => string '/srv/www/htdocs/public/project/application/protected/modules/admin' (length=71)
  private '_modulePath' (CModule) => null
  private '_params' (CModule) => null
  private '_modules' (CModule) => 
    array (size=0)
      empty
  private '_moduleConfig' (CModule) => 
    array (size=0)
      empty
  private '_components' (CModule) => 
    array (size=0)
      empty
  private '_componentConfig' (CModule) => 
    array (size=1)
      'user' => 
        array (size=4)
          'class' => string 'CWebUser' (length=8)
          'allowAutoLogin' => boolean true
          'baseUrl' => string '/project/application/index.php/admin/user/login' (length=52)
          'stateKeyPrefix' => string '_admin' (length=11)
  private '_e' (CComponent) => null
  private '_m' (CComponent) => null

2 个答案:

答案 0 :(得分:1)

默认情况下,方法setComponentssetComponent)检查组件是否已定义,它仅将新参数与旧参数合并。 因此,您必须将第二个参数设置为false以重新定义新组件(组件):

public function init() {
    parent::init();

    $this->setComponents(array(
        'user'=>array(
            'class' => 'CWebUser',
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
            'baseUrl'=>Yii::app()->createUrl("admin/user/login"),
            'stateKeyPrefix' => '_admin',
        ),
    ), false);
}
  

顺便说一句,在模块内部,您可以使用组件而无需调用   模块:

Yii::app()->user->login($this->_identity,$duration);
Yii::app()->user->logout();

答案 1 :(得分:1)

请来自工作项目的代码。 模块主类中定义的用户组件:

public function init() {
    parent::init();
    $this->setImport(array(
        'admin.models.*',
        'admin.components.*',
    ));
    Yii::app()->setComponents(array(
        'user'=>array(
            'class'=>'AdminWebUser',
            'allowAutoLogin'=>true,
            'loginRequiredAjaxResponse'=>'Dear admin, your session expired, login and try again',
            'stateKeyPrefix'=>'admin_',
            'authTimeout'=>14400,
        ),      
    ), false);
}

和主配置文件中定义的默认用户组件:

'user'=>array(
    'class'=>'WebUser',
    'loginRequiredAjaxResponse'=>'Your session expired, login and try again',
    'autoRenewCookie'=>false,
    'allowAutoLogin'=>false,
    'stateKeyPrefix'=>'user_',
    'loginUrl'=>'/home/login',
),

所以你可以"为一个用户提供两个会话" 取决于模块(在模块其他会话中,在root -other中)。例如,var_dump(Yii::app()->user->stateKeyPrefix) out of module给出user_,但在模块中给出admin_实际上yii使用相同的会话文件,但根据stateKeyPrefix 设置和获取数据(当我们使用setState()getState()时)。

因此,如果您使用userNameadmin保留在Yii::app()->user->setState('userName', 'John')模块中,则会将其放入会话文件'admin_userName' => 'John'中,这意味着您可以从admin中获取该值使用 Yii::app()->session->get('admin_userName') 模块(例如在root中)。 如果您尝试使用getState来获取它(模块外),则无法返回正确的值,因为它必须找到user_userName(因为在root中,对于用户组件'stateKeyPrefix' => 'user_')而不是admin_userName

谢谢你,并且抱歉长篇大论))