想要在 yii2 中分离前端和后端用户

问题描述 投票:0回答:6

因为 yii2 Advanced 中只有 user 表。因此用户可以使用相同的凭据登录前端和后端。我们想把它分开。

所以我创建了frontuser表,其结构与用户表相同。 然后使用 gii 模型生成器创建其模型

将其设为通用模型/用户。

这里是前端/模型/前端用户

<?php namespace frontend\models; use Yii; use yii\base\NotSupportedException; use yii\behaviors\TimestampBehavior; use yii\db\ActiveRecord; use yii\web\IdentityInterface; /** * This is the model class for table "frontuser". * * @property integer $id * @property string $username * @property string $auth_key * @property string $password_hash * @property string $password_reset_token * @property string $email * @property integer $status * @property integer $created_at * @property integer $updated_at */ //class Frontuser extends \yii\db\ActiveRecord class Frontuser extends ActiveRecord implements IdentityInterface { /** * @inheritdoc */ const STATUS_DELETED = 0; const STATUS_ACTIVE = 10; public static function tableName() { return '{{%frontuser}}'; } /** * @inheritdoc */ public function rules() { return [ ['status', 'default', 'value' => self::STATUS_ACTIVE], ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], ]; } /** * inheritdoc */ public static function findIdentity($id) { return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); } /** * Finds user by username * * @param string $username * @return static|null */ public static function findByUsername($username) { return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]); } /** * Finds user by password reset token * * @param string $token password reset token * @return static|null */ public static function findByPasswordResetToken($token) { if (!static::isPasswordResetTokenValid($token)) { return null; } return static::findOne([ 'password_reset_token' => $token, 'status' => self::STATUS_ACTIVE, ]); } /** * Finds out if password reset token is valid * * @param string $token password reset token * @return bool */ public static function isPasswordResetTokenValid($token) { if (empty($token)) { return false; } $timestamp = (int) substr($token, strrpos($token, '_') + 1); $expire = Yii::$app->params['user.passwordResetTokenExpire']; return $timestamp + $expire >= time(); } /** * @inheritdoc */ public function getId() { return $this->getPrimaryKey(); } /** * @inheritdoc */ public function getAuthKey() { return $this->auth_key; } /** * @inheritdoc */ public function validateAuthKey($authKey) { return $this->getAuthKey() === $authKey; } /** * Validates password * * @param string $password password to validate * @return bool if password provided is valid for current user */ public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } /** * Generates password hash from password and sets it to the model * * @param string $password */ public function setPassword($password) { $this->password_hash = Yii::$app->security->generatePasswordHash($password); } /** * Generates "remember me" authentication key */ public function generateAuthKey() { $this->auth_key = Yii::$app->security->generateRandomString(); } /** * Generates new password reset token */ public function generatePasswordResetToken() { $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); } /** * Removes password reset token */ public function removePasswordResetToken() { $this->password_reset_token = null; } }

在 frontend/config/main.php

<?php $params = array_merge( require(__DIR__ . '/../../common/config/params.php'), require(__DIR__ . '/../../common/config/params-local.php'), require(__DIR__ . '/params.php'), require(__DIR__ . '/params-local.php') ); return [ 'id' => 'app-frontend', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'controllerNamespace' => 'frontend\controllers', 'components' => [ 'request' => [ 'csrfParam' => '_csrf-frontend', ], // 'user' => [ // 'identityClass' => 'common\models\User', // 'enableAutoLogin' => true, // 'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true], // ], 'user' => [ 'class' => 'yii\web\User', // basic class 'identityClass' => 'frontend\models\Frontuser', // your admin model 'enableAutoLogin' => true, 'loginUrl' => '/admin/frontend/login', ], 'session' => [ // this is the name of the session cookie used for login on the frontend 'name' => 'advanced-frontend', ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'authManager' => [ 'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager' 'defaultRoles'=> ['guest'], ], 'errorHandler' => [ 'errorAction' => 'site/error', ], /* 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], */ ], 'params' => $params, ];

但是,我注册了,条目进入用户表.. 我想使用

user 表作为后端用户 和前端用户的frontuser表 怎么办?

php yii2
6个回答
2
投票
    在数据库中创建与用户表相同字段的表,并将其命名为 frontuser
  1. 复制 common\models\user.php 并将其放在 frontend\models rontuser.php 上 进行以下更改

    use yii\helpers\Security;

    class Frontuser extends ActiveRecord implements IdentityInterface
    (return '{{%frontuser}}';)

  2. 将 common\models\LoginForm.php 复制到 frontend\models\LoginForm.php 中更改即可

    命名空间前端\模型;

  3. 前端\sitecontroller.php •

    use frontend\models\LoginForm;

  4. frontend\models\signup.php 只需更改

    Replace common to frontend.

    new Frontuser
     


1
投票
一种方法可以基于 modelMap

在您的前端/config/main.php中

您可以重新分配用户模块的模型映射,并将您的用户模型指向您需要的表,例如:

'modules' => [ ....... 'user' => [ 'class' => your_user_class', // eg: 'class' => 'yii2\user\Module' // check in Yii2 / Yiisoft vendor // or in your vendor for the right module 'admins' => ['your_admin'], 'modelMap' => [ 'User' => 'frontend\models\FrontUser', ], ],
    

1
投票
您应该检查注册操作中使用的表单模型。大概就是

frontend\models\SignupForm

。 SignupForm 使用 
common\models\User
 作为用户模型。您应该将其更改为
frontend\models\Frontuser
。因此,请检查登录、注销、注册、重置密码操作。将前端模型更改为 
frontend\models\Frontuser
 everyware。


1
投票
根据Goli的回答我想补充一处!

1. Copy user table in database and name it frontuser 2. Copy common\models\user.php and place it on frontend\models\frontuser.php make following changes: class Frontuser extends ActiveRecord implements IdentityInterface ...(return '{{%frontuser}}';) 3. Copy common\models\LoginForm.php in frontend\models\LoginForm.php just change namespace frontend\models; 4. frontend\sitecontroller.php use frontend\models\Frontuser; use frontend\models\LoginForm; use frontend\models\PasswordResetRequestForm; use frontend\models\ResetPasswordForm; use frontend\models\SignupForm; use frontend\models\ContactForm; 5. frontend\models\signup.php just change Replace common to frontend new Frontuser 6. Change in config\main.php 'user' => [ 'identityClass' => 'frontend\models\Frontuser', 'enableAutoLogin' => true, 'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true], ],
    

0
投票
您可以通过两种方式做到这一点: 第一个是在用户表中添加字段类型以区分管理员和用户 但按照你的方式,你应该在 web.php 中声明另一个组件

'admin' => [ 'identityClass' => 'app\models\admin', 'enableAutoLogin' => true, 'idParam' => '_admin' ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'idParam' => '_user' ],

并在访问行为后端添加此参数

'用户' => Yii::$app->admin,


0
投票
您可以将以下代码放在组件下的 forntend/config/main.php 中

'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true , 'identityCookie' => [ 'name' => '_frontendUser', // unique for frontend 'path'=>'/frontend/web' // correct path for the frontend app. ] ],

您可以将以下代码放在组件下的 backend/config/main.php 中

'admin' => [ 'identityClass' => 'app\models\adminUsers', 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_backendUser', // unique for backend 'path' => '/advanced/backend/web' // correct path for backend app. ] ],

您可以复制通用用户identityClass并将其名称更改为adminUsers并将此文件粘贴到后端模型中。

您可以获取前端的用户会话数据,例如 Yii::$app->user->identity->id 您可以获取前端的用户会话数据,例如 Yii::$app->admin->identity->id

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.