2017-11-15 13 views
1

ユーザー yii2の表のみが先進的です。ユーザーは同じ信任状でフロントエンドとバックエンドの両方にログインできます。私たちはそれを欲しい。yii2のフロントエンドとバックエンドユーザーを分離したい

私はフロントユーザテーブルを作成しました。これはユーザテーブルと同じ構造です。 次に、giiモデルジェネレータを使用してモデルを作成しました。

を共通モデル/ユーザーとして作成しました。ここ

は、フロントエンド/モデル/ frontuserある

<?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; 
    } 
} 

とフロントエンド/設定/ 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, 
]; 

それでも、私がサインアップし、エントリーがユーザーテーブルに行く.. Iで

ユーザバックエンドユーザのテーブル と frontuserフロントエンドユーザ用テーブル どうすればいいですか?

答えて

1
  1. 変更し、次の\ frontuser.php メイクをユーザテーブル名それfrontuser

  2. コピー共通\モデル\ user.phpとしてデータベースと同じフィールドにテーブルを作成し、フロントエンド\モデルの上に置きます?use yii\helpers\Security;class Frontuser extends ActiveRecord implements IdentityInterface

  3. (return '{{%frontuser}}';)•コピー共通\モデル\フロントエンド\モデルでLoginForm.php \ LoginForm.phpはちょうど

    名前空間のフロントエンド\モデルを変更します。

  4. フロントエンドの\ sitecontroller.php

  5. use frontend\models\LoginForm;•フロントエンド\モデルが\ゴリ私の答えによると new Frontuser

+0

非常に良い!問題は、ユーザーのログインチェックが肯定的ですが、ユーザーはまだゲストで、[ログイン]タブを使用してログインページに戻ってくることです。 main.phpの追加の変更を行う必要があります。私はあなたの推薦に基づいて別の答えで追加を行います! – Perino

0

次の2つの方法でこれを行うことができます。 最初のものは、個別の管理者とユーザー にユーザテーブルにフィールドタイプを追加することですが、あなたの方法であなたはweb.php

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

と中で別のコンポーネントを宣言する必要がありますアクセス動作のバックエンドは、このparametr

'ユーザー' =>のYii :: $ APP->管理者を追加し、

1

方法はmodelMap

に基づくことができますあなたが例えばを必要とする表にユーザモジュールとユーザーモデルポイントのモデルマップを再割り当てすることができあなたのフロントエンド/設定/ 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すべてのソフトウェアに変更します。

+0

frontend signupフォームの値はfrontuserテーブルに入りますが、ログインするとuserテーブルで検索します...ログインフォームを作成してfrontuserテーブルの認証情報を検証する方法はありますか? – Darsh

+0

common \ models \ LoginForm.phpを確認してください。 を追加します。「フロントエンド\モデル\フロントエンドを使用してください。 getUser()メソッドのUser to Frontuserを変更してください –

0

あなたがコンポーネントの下にバックエンド/設定/ main.phpのコードの下に置くことができコンポーネント

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

下forntend /設定/ 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

1

•ちょうどReplace common to frontend.

を変更signup.php 1つの追加と1つの修正を行いたい!

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], 
     ], 
関連する問題