1. 程式人生 > >YII2.0實現前後臺分離登錄

YII2.0實現前後臺分離登錄

pda reat tro nds efault 用戶 個數 prim web

要實現前後臺分離登錄, 那我們先建立一個admin表,用來存放管理員數據,而會員仍然用原有的user表.

首先, 我們運行 yii migrate/create admin 創建一個migration 時間戳,用來編寫創建Admin表:

<?php
  use yii\db\Migration;
  class m160427_133556_create_admin extends Migration
  {
    const TBL_NAME = ‘{{%admin}}‘;
    public function safeUp()
    {
      $tableOptions = null
;       if ($this->db->driverName === ‘mysql‘) {         $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB COMMENT="後臺管理員表"‘;       }       $this->createTable(self::TBL_NAME, [         ‘id‘ => $this->primaryKey(),         ‘username‘=>$this->string()->notNull()->unique()." COMMENT ‘用戶名‘",         ‘auth_key‘=>$this
->string(32)->notNull()." COMMENT ‘認證Key‘",         ‘password_hash‘=>$this->string()->notNull()." COMMENT ‘密碼‘",         ‘password_reset_token‘=>$this->string()->unique()." COMMENT ‘密碼重置Token‘",         ‘email‘=>$this->string()->notNull()->unique()." COMMENT ‘郵箱‘",         ‘status‘=>$this
->smallInteger()->notNull()->defaultValue(10)." COMMENT ‘狀態‘",         ‘created_at‘ => $this->integer()->notNull()." COMMENT ‘創建時間‘",         ‘updated_at‘ => $this->integer()->notNull()." COMMENT ‘更新時間‘",       ],$tableOptions);     }     public function safeDown()     {       $this->dropTable(self::TBL_NAME);     }   }

繼續運行下述命令行代碼,即可生成admin表,由於只是做演示,所以admin和user表基本一樣,不要在意這些細節。

yii migrate

好了,生成兩個表後,我們就需要將前臺登錄和後臺登陸徹底分開了:

1、前臺修改:由於已經不公用了,所以先把公用的common/models中的User.php和LoginForm.php移動到frontend/models中去,順便將這兩個文件的命名空間改為以frontend開頭,將整個前臺文件看一遍,把所有涉及到這兩個common文件命名空間的需要都改為前臺自己的命名空間。

2、後臺修改:同樣需要在backend/models中有這兩個文件Admin.php和LoginForm.php,可以使用Gii生成(需要註意要繼承IdentityInterface,實現此接口內的方法以及參照User.php來實現相關登錄註冊方法),也可以直接復制同樣上面的兩個文件(需要將User.php改名為Admin.php,且註意user表和admin表字段名稱或個數是否一致,不一致則需要在Admin.php中修改)。

現在我們後臺表雖然創建好了,但是還沒有添加管理員,現在由於後臺已經登陸不進去了,所以在後臺內也無法創建了,並且註冊功能也沒有(這種分離下,後臺一般沒必要有註冊功能),所以這裏繼續用console的功能來創建一個用戶,控制臺的功能挺多的,不僅僅是數據庫管理。

在console/controllers中新建InitController.php,然後寫入如下代碼:

<?php
  namespace console\controllers;
  use backend\models\Admin;
  class InitController extends \yii\console\Controller
  {
    /**
    * Create init admin
    */
    public function actionAdmin()
    {
      echo "Create init admin ...\n"; // 提示當前操作
      $username = $this->prompt(‘Admin Name:‘); // 接收用戶名
      $email = $this->prompt(‘Email:‘); // 接收Email
      $password = $this->prompt(‘Password:‘); // 接收密碼
      $model = new Admin(); // 創建一個新用戶
      $model->username = $username; // 完成賦值
      $model->email = $email;
      $model->password = $password;//註意這個地方,用了Admin模型中的setPassword方法(魔術方法__set)
      if (!$model->save()) // 保存新的用戶
      {
        foreach ($model->getErrors() as $error) // 如果保存失敗,說明有錯誤,那就輸出錯誤信息。
        {
          foreach ($error as $e)
          {
            echo "$e\n";
          }
        }
        return 1; // 命令行返回1表示有異常
      }
      return 0; // 返回0表示一切OK
    }
  }

按照提示來填寫用戶名密碼等,便可以產生一條數據了,當我們查看這條記錄時,發現我們填寫的明文密碼變成加密的了,而創建時間和更新和更新時間我們沒填寫也自動給填寫了.

3、現在我們前後臺都能按照自己數據庫裏的數據來登錄了,但是由於session等公用一個,所以還是退出時,前後臺一起退出,需要進一步操作:可以參照這篇wiki。

後臺,在backend/config/main.php或者main-local.php中

‘components‘ => [
  ‘user‘ => [
    ‘identityClass‘ => ‘backend\models\Admin‘,
    ‘enableAutoLogin‘ => true,
    ‘identityCookie‘ => [
      ‘name‘ => ‘_backendUser‘, // unique for backend
    ],
  ],
  ‘session‘ => [
    ‘name‘ => ‘PHPBACKSESSID‘,
    ‘savePath‘ => sys_get_temp_dir(),
  ],
  ‘request‘ => [
    ‘cookieValidationKey‘ => ‘orGkZNZvZe3-4WicYHyGMS-EyI6Tp8yi‘,//random string
    ‘csrfParam‘ => ‘_backendCSRF‘,
  ],

同樣在前臺,在frontend/config/main.php或者main-local.php中:

‘components‘ => [
  ‘user‘ => [
  ‘identityClass‘ => ‘frontend\models\User‘,
  ‘enableAutoLogin‘ => true,
  ‘identityCookie‘ => [
    ‘name‘ => ‘_frontendUser‘, // unique for frontend
    ]
  ],
  ‘session‘ => [
    ‘name‘ => ‘PHPFRONTSESSID‘,
    ‘savePath‘ => sys_get_temp_dir(),
  ],
  ‘request‘ => [
    ‘cookieValidationKey‘ => ‘8rqO22WJ9yiAx_KuJ8SFnbKctqGDWi9J‘,
    ‘csrfParam‘ => ‘_frontendCSRF‘,
  ],

這樣再登陸試下,就會發現前後臺完全沒關聯了。可以調用Yii::$app的功能,例如Yii::$app->user->id,如果是在後臺的目錄中,會顯示後臺的用戶id,如果是在前臺的目錄中則會顯示前臺的用戶id。可能有些強迫癥患者想同Yii1那樣用Yii::$app->admin->id來訪問後臺用戶id,這個不太好實現,Yii2和Yii1相比,用戶驗證這塊改動挺大的,web/User在Yii2框架中作為核心組件,如果要修改的話應該還要關聯修改web/Application中的變量方法等,個人感覺沒必要。

以上,就是所說的,其實還有很多已經集成好的yii2-user、帶權限控制等的插件可以直接從composer中搜索使用。例如點擊率最高的這個,可以配置B類型的驗證,而且集成了更多功能。

YII2.0實現前後臺分離登錄