zoukankan      html  css  js  c++  java
  • YII2.0实现前后台分离登录

    要实现前后台分离登录, 那我们先建立一个admin表,用来存放管理员数据,而会员仍然用原有的user表.

    首先, 我们运行 yii migrate/create admin 创建一个migration 时间戳,用来编写创建Admin表:

    <?php
      use yiidbMigration;
      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 consolecontrollers;
      use backendmodelsAdmin;
      class InitController extends yiiconsoleController
      {
        /**
        * Create init admin
        */
        public function actionAdmin()
        {
          echo "Create init admin ...
    "; // 提示当前操作
          $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
    ";
              }
            }
            return 1; // 命令行返回1表示有异常
          }
          return 0; // 返回0表示一切OK
        }
      }

    在控制台中输入:

    yii init/admin

    按照提示来填写用户名密码等,便可以产生一条数据了,当我们查看这条记录时,发现我们填写的明文密码变成加密的了,而创建时间和更新和更新时间我们没填写也自动给填写了.

    3、现在我们前后台都能按照自己数据库里的数据来登录了,但是由于session等公用一个,所以还是退出时,前后台一起退出,需要进一步操作i。

    后台,在backend/config/main.php或者main-local.php中

    'components' => [
      'user' => [
        'identityClass' => 'backendmodelsAdmin',
        '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' => 'frontendmodelsUser',
      '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类型的验证,而且集成了更多功能。

  • 相关阅读:
    边缘计算的爆发为安防全产业带来了怎样的变化?
    Kali卸载AWVS的方法
    C++最简打开网页的方法
    C# 打开指定文件或网址
    C# 如何获取某用户的“我的文档”的目录
    基于Debian的linux系统软件安装命令
    C#的基础知识
    MYSQL语句中的增删改查
    将博客搬至CSDN
    【易懂】斜率DP
  • 原文地址:https://www.cnblogs.com/zrcx/p/6882065.html
Copyright © 2011-2022 走看看