Yii2:是否可以从后端打开前端会话?


Yii2: Is it possible to open a frontend session from backend?

我现在在yii2上挣扎。以下场景:

我使用yii2高级模板,有一个前端和一个后端,分别有单独的用户表和登录。

现在我正在寻找一种方式,后端用户可以从后端登录作为前端用户。假设你在后台查看一个前端用户,你可以点击"作为这个用户登录"。

这种情况可能吗?

我试图在后端配置一个前端使用:

'user' => [
         'identityClass' => 'backend'models'BackendUser',
         'enableAutoLogin' => false,
 ],
 'frontendUser' => [
        'class' => 'yii'web'User',
        'identityClass' => 'common'models'User',
        'enableAutoLogin' => false,
  ],

在我的控制器中,我尝试了这个:

if (Yii::$app->frontendUser->login($user_group->user, 0)) {
    return $this->redirect(Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index', 'client' => $client->login_address]));
}

谢尔盖回答后编辑:

后端配置

'user' => [
            'identityClass' => 'backend'models'BackendUser',
            'enableAutoLogin' => true,
            'identityCookie' => [
                'name' => '_backendUser', // unique for backend
            ]
        ],

前端配置:

'user' => [
            'identityClass' => 'common'models'User',
            'enableAutoLogin' => true,
            'loginUrl' => ['message/welcome'], // weil beim SessionTimeout darauf umgeleitet wird,
            'authTimeout' => 1800,
            'identityCookie' => [
                'name' => '_frontendUser', // unique for frontend
            ]
        ],
控制器功能:

public function actionLoginAs($id)
    {
        $user_group = UserGroup::findOne($id);
        if (is_null($user_group)) {
            return $this->redirect(['site/index']);
        }
        $group = $user_group->group;
        $client = $group->client;
        $yiiuser = new yii'web'User([
                'identityClass' => 'common'models'User',
                'identityCookie' => [
                        'name' => '_frontendUser', // unique for frontend
                ]
        ]);
        $user = $user_group->user;
        if ($yiiuser->login($user, 15 * 60)) {
            return $this->redirect(Yii::$app->urlManagerFrontend->createAbsoluteUrl(['site/index', 'client' => $client->login_address]));
        }
    }
  1. 您必须分隔验证cookie名称:

前端

'user' => [
  'identityClass' => 'common'models'User',
  'enableAutoLogin' => true,
  'identityCookie' => [
  'name' => '_frontendUser', // unique for frontend
  ]
],

后台

'user' => [
  'identityClass' => 'backend'models'BackendUser',
  'enableAutoLogin' => true,
  'identityCookie' => [
  'name' => '_backendUser', // unique for backend
  ]
],

实际上将前端和后端用户分开

  • 我认为你必须在后端创建方法,如admin/auth/loginUser
  • AuthController

    public function actionLoginUser($login) {
        // check admin is loggin in
        $yiiuser = new yii'web'User([
            'identityClass' => 'common'models'User',
            'identityCookie' => [
                'name' => '_frontendUser', // unique for frontend
            ]
        ]);
        $user = common'models'User::findByUsername($login);
        // check user exists
        $yiiuser->login($user, false, 15 * 60); // 15 min
        return $this->redirect('/');
    }
    

    在后台:

    public function actionLogin($id)
    {
      ///find customer by id
      $customer = $this->findModel($id);
      //generate new access token to admin for login
      $auth_key = $customer->generateAuthKey();
      //save customer model changes  
      $customer->save();
      //make url for login in frontend
      $url = Yii::$app->params['frontendUrl'] . '/site/magic-login?k='.$auth_key;
      return $this->redirect(Yii::$app->params['frontendUrl'] . '/site/magic-   login?k='.$auth_key);
     }
    

    in forntend:

    public function actionMagicLogin()
    {
       //logout logged user
       Yii::$app->user->logout();
       //find customer by access token
       $customer = Customer::findIdentityByAccessToken($_GET['k']);
       //login customer and make sessions
       if (Yii::$app->user->login($customer))
       {
         //expire access token
         $customer->generateAuthKey();
         //redirect to show customer  dashboard
         $this->redirect(['customer/account']);
       }
       else
       {
          //if login faild redirect to login page
          return $this->render('login');
        }
      }