Yii - модуль с собственным компонентом UserIdentity - PullRequest
3 голосов
/ 16 февраля 2011

Я начал использовать инфраструктуру Yii, и у меня возник вопрос -newbie- об использовании компонента UserIdentity .

В моем приложении есть модуль администратора, который будет выполнять роль бэк-офиса для контента, отображаемого на реальном сайте. Этот модуль имеет собственную таблицу для администраторов tbl_admin_user.

Я хочу отделить метод входа в систему (для проверки по этой таблице вместо tbl_user) модуля от общего сайта. Для этого я предположил, что мне нужно реализовать метод аутентификации UserIdentity только для модуля, а не для полного приложения, исправьте мой, если я не прав.

Когда я переопределяю этот метод, я ничего не получаю. Модуль администратора использует UserIdentity , расположенный в * защищенных \ компонентов * вместо своего собственного.

Есть предложения?

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Вы не должны импортировать свой класс идентификации модуля.Для этого просто измените свою функцию init в классе вашего модуля, расширяющего CWebModule, как показано ниже:

public function init()
{
    $this->setImport(array(
        '#moduleName#.models.*',
        '#moduleName#.components.*',
    ));
}

Таким образом, будут импортированы все компоненты вашего модуля (а также модели), то есть ваш класс идентификации модуля.*

Будьте осторожны: при этом у вас есть 2 импортированных класса с одинаковым именем UserIdentity .Если ваше приложение хорошо настроено, модуль должен иметь приоритет в модуле из-за положения его каталога в include_path.Но вы должны дать вашему классу другое имя, расширяющее CUserIdentity в вашем модуле, например AdminUserIdentity .Затем при входе в систему вы используете new AdminUserIdentity ($ username, $ password) вместо new UserIdentity ($ username, $ password) .Это сделает ваш код чище.

0 голосов
/ 02 июля 2014

В GiiModule мы использовали:

/**
 * Initializes the gii module.
 */
public function init()
{
    parent::init();
    Yii::setPathOfAlias('gii',dirname(__FILE__));
    Yii::app()->setComponents(array(
        'errorHandler'=>array(
            'class'=>'CErrorHandler',
            'errorAction'=>$this->getId().'/default/error',
        ),
        'user'=>array(
            'class'=>'CWebUser',
            'stateKeyPrefix'=>'gii',
            'loginUrl'=>Yii::app()->createUrl($this->getId().'/default/login'),
        ),
        'widgetFactory' => array(
            'class'=>'CWidgetFactory',
            'widgets' => array()
        )
    ), false);
    $this->generatorPaths[]='gii.generators';
    $this->controllerMap=$this->findGenerators();
}

Так что если вы хотите изменить систему входа в систему для этого модуля, просто создайте другого пользователя для модуля, и вы отделите пользовательские функции от приложения Пользовательские функции.

0 голосов
/ 02 июля 2014

в Yii2 мне удалось переопределить класс User, добавив его в контроллер по умолчанию для модуля администратора:

    public function init() {
    // this overrides the User Identity class
    // and uses the one provided by the admin module
    \Yii::$app->set("user", [
         'class' => 'yii\web\User',
         'identityClass' => 'app\modules\admin\models\User',
         'enableAutoLogin' => true,
    ]);
}
...