множественная идентификация пользователя в конфигурации Yii2

Я разрабатываю сайт с двумя разными регистрациями, и у меня есть 2 разные таблицы, я использую RbacDB, и в веб-конфигурации в разделе компонентов у меня есть конфигурация пользователя, в соответствии с этим я хочу знать, как я могу использовать 2 разных поля в файл конфигурации?

конфигурация:

'components' => [
    'request' => [
        // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
        'cookieValidationKey' => '213h2i3121h12osiajls',
    ],
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
    'user' => [
        'identityClass' => 'app\models\User',
        'enableAutoLogin' => true,
    ],
    // Here after user I need to add another config user-two
    'user-two' => [
        'identityClass' => 'app\models\SecondUser',
        'enableAutoLogin' => true,
    ],

когда я это делаю, показывает эту ошибку введите здесь описание изображения

Спасибо!


person root_milka    schedule 07.02.2016    source источник


Ответы (3)


Попробуйте установить свойство класса в компоненте user-two:

'user-two' => [
    'class' => 'yii\web\User'
    'identityClass' => 'app\models\SecondUser',
    'enableAutoLogin' => true,
],

или создайте новый класс, унаследованный от класса yii\web\User, и установите его следующим образом:

'user-two' => [
    'class' => 'app\models\NewClassInheritedFromUserClass'
    ....
]

Может быть, это поможет вам.

person Andrew Bu    schedule 07.02.2016
comment
Пробовал оба варианта, ошибка ушла, Tnx! но пользователь все еще не вошел в систему - person root_milka; 07.02.2016
comment
лучше всего создать новый класс, унаследованный от класса yii\web\User. В этом классе вы должны переопределить public $identityCookie = ['name' => '_user_two_identity', 'httpOnly' => true];, потому что пользователь и пользователь-два должны иметь разные куки для авторизации. после ввода логина и пароля загляните в куки. вы видите файл cookie _user_two_identity? кстати, где-то в вашем коде (думаю, в форме входа) вы должны вызвать \Yii::$app->user-two->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); (не Yii::$app-›user-›login(...)) - person Andrew Bu; 07.02.2016
comment
Может ли кто-нибудь привести конкретный пример кода, использующего два идентификатора? Я пытаюсь это сделать, но у меня не получается. Вроде второй подкласс yii\web\User работает, но при попытке пользователя AccessRule для действия AdminController не получается, не понимает, что пользователь уже залогинился, но используя другой identityClass, а не дефолтный. - person Vasilis Lourdas; 31.01.2018

Вы должны создать класс веб-пользователя для второго идентификатора

namespace app\components;

class UserTwo extends \yii\web\User{
}

чем указать имя класса в вашей конфигурации

'user-two' => [
        'class'=> 'app\components\UserTwo'
        'identityClass' => 'app\models\SecondUser',
        'enableAutoLogin' => true,
    ],
person Nader    schedule 07.02.2016

Я изучил внутренности фреймворка yii2. Насколько я понял, вы можете создать N личностей, следуя приведенной ниже методике;


  • Вышеупомянутые решения - это всего лишь предложения, которые являются частичными ответами и некоторыми полезными. Пожалуйста, внимательно следуйте моим изменениям ниже, и вы можете создать N идентификаторов по своему усмотрению.
  • Идентификации N очень полезны, когда вы не хотите внедрять сложный RBAC (управление доступом на основе ролей) и просто хотите фильтровать доступ по запросу контроллера.

  • Предположим, мне нужно создать еще одну личность под названием «Франшиза», отличную от существующего пользователя, которая хорошо связана внутри Yii2 Framework.


Миграция БД

  1. Создайте новый файл миграции с помощью команды

    yii migrate/create create_franchise
    
  2. Скопируйте и вставьте содержимое уже доступного файла миграции в папку PROJECT_NAME\console\migrations что-то вроде «m170311_105858_create_user.php» и переименуйте таблицу с « пользователь» на «франшиза».

  3. Теперь запустите команду миграции

    yii/migrate
    
    • Вы должны получить что-то подобное в командной строке

        Apply the above migrations? (yes|no) [no]:yes
      
        applying m170311_105950_create_franchise
        create table {{%franchise}} ... done (time: 1.304s)
        applied m170311_105950_create_franchise (time: 1.350s)
      
  4. проверьте БД, создана ли БД. (Я предполагаю, что вы сделали настройки БД в PROJECT_NAME\common\config\main-local.php)

  5. Обратите внимание, что каким бы ни был класс Identity, теперь он должен использовать приведенную выше таблицу «Франшиза».

Создание модели франшизы

  1. Просто перейдите в модуль «Gii» и создайте модель для новой таблицы франшизы.

  2. Расположение модели должно быть PROJECT_NAME\common\models\Franchise.php.

  3. Убедитесь, что класс Model реализует IdentityInterface, а также реализует обязательные методы IdentityInterface.


Класс идентификации

  1. Если вы перейдете в папку PROJECT_NAME\vendor\yiisoft\yii2\web\User.php. Это класс, который повсюду в вашем проекте упоминается как Yii::$app->user. Скопируйте и вставьте содержимое этого класса и создайте новый файл с именем PROJECT_NAME\vendor\yiisoft\yii2\web\Franchise.php и вставьте в него содержимое. Внесите следующие изменения в файл.

    • Find 'user' and replace it with 'franchise'.
    • Найдите «Пользователь» и замените его на «Франшиза».
    • Найдите $loginUrl = ['site/login']; и замените его на $loginUrl = ['franchise/login'];, так как у вас будет другой контроллер для обрабатывать действия, связанные с франшизой.
    • Найдите $identityCookie = ['name' => '_identity', 'httpOnly' => true]; и замените 'name' на '_fidentity' (вы видите разницу, идентификационный файл cookie должен быть уникальным)
    • Найдите $authTimeoutParam = '__expire'; и замените его на $authTimeoutParam = '_f_expire';

PROJECT_NAME\vendor\yiisoft\yii2\web\Application.php

  1. В Application.php добавьте метод ниже,

    public function getFranchise()
    {
        return $this->get('franchise');
    }
    
  2. Также найдите метод coreComponents() и добавьте еще одну запись, как показано ниже:

    'Franchise' => ['class' => 'yii\web\Franchise'],
    

PROJECT_NAME\frontend\config\main.php

  1. Внутри компонентов добавьте запись ниже сразу после записи «пользователь»,

     'franchise' => [
            'identityClass' => 'common\models\Franchise',
            'enableAutoLogin' => true,
            'class' => 'yii\web\Franchise',
            'identityCookie' => ['name' => '_fidentity-frontend', 'httpOnly' => true],
        ],
    
person Ankur Soni    schedule 11.03.2017
comment
Если вы измените PROJECT_NAME\vendor\yiisoft\yii2\web\Application.php, то в следующий composer update вы потеряете все изменения, сделанные в этом файле. - person Vasilis Lourdas; 01.02.2018