yii2项目实战-用户管理之user组件的配置
更新于 2016年11月08日 by 白狼 被浏览了 6441 次

我们在上一小节中借助yii-adminlte-asset搭建了我们的管理后台,目前为止,我们也是仅仅使用了他的模版文件,关于他的一些特性我们后面再做介绍。

上一章节,为了更好的演示adminlte模版界面的效果,我们临时屏蔽了backend\controllers\SiteController.php文件中behaviors的access项,先恢复过来,我们刷新下首页,默认的是site/index操作,直接跳转到登录界面了。access项的实质是一种【行为】,其附加在当前控制层,限制了一些规则。比如说site/index这里就设定了规则:必须是已登录用户才可以访问。关于行为的细节以及ACF(AccessControl Filter)本文不做深究,后面到了该说的时候自然会做详细的说明。有些同学要说了,既然如此,去掉这个access好了,但是这个是必须要加的,因为你我都不想暴露我们的后台让所有人都可以访问吧。既然如此,我们就需要登录,就需要创建新的用户!

创建后台用户表

本小节,我们来看看如何来使用yii2这个登录注册模块,为了更好的对其进行一个理解,我们创建一个与yii自带的用户表做一个稍微不同的数据表。

首先,我们参考yii自带的用户表结构(自带的用户表参考console\migrations\xxx_init.php文件)创建如下数据表

CREATE TABLE `user_backend` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `auth_key` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我们修改了表名,删减了password_reset_token字段以及修改了created_at和updated_at字段,有同学要疑问了,自带的不好吗,为嘛非要删减点呢?是要显示你的高超还是要咋滴?其实真没这个意思,我们这里仅仅是为了教大家如何更好的更易于理解的去使用yii2自带的登录注册模块,不信你看完就知道我有没有说谎了。

接下来我们通过 /index.php?r=gii 访问gii模块生成相关的model和curd,在【入门指南】中,我们有针对gii的使用做过讲解,这里就一带而过好了。

到这里你的项目应该多了下面几个文件

backend\models\UserBackend.php
backend\models\UserBackendSearch.php
backend\controllers\UserBackendController.php
backend\views\user-backend\增删改查等页面

也就是说我们现在应该能够直接访问 /index.php?r=user-backend 看到后台用户的管理列表了!但是这里仅仅是第一步操作!

配置yii2的user模块

万事开头难,迈出了第一步,后面就相对而言简单了,但是还不足以让你掉以轻心!

为了让我们的数据表user-backend支持管理后台的登录注册功能,我们需要对其做一个简单的配置,包括下面这几个操作步骤!

①、配置下identityClass认证类(该类是用于登录等操作的认证)

打开backend\config\main.php, 找到components user这里,修改backend\models\UserBackend类为我们的认证类

'components' => [
    'user' => [
        'identityClass' => 'backend\models\UserBackend',
        'enableAutoLogin' => true,
    ],
],

②、修改登录操作中使用的认证类为 backend\models\UserBackend ,为后面实现登录提前做准备

打开common\models\LoginForm.php文件,找到getUser方法,这里的User类使用的还是common\models\User类,我们在文件顶部引入第一步中配置的identityClass目标类

use backend\models\UserBackend as User;

③、虽然我们配置了认证类为UserBackend,但是我们还需要为该类增加认证方法呀等操作。接着我们就针对认证类进行实现。

先打开我们配置的identityClass的目标文件backend\models\UserBackend.php, 该类至少需要实现接口 yii\web\IdentityInterface 几个抽象方法才可以哦。

包括下面的 根据用户id获取用户身份的方法findIdentity、根据access_token获取用户身份的方法findIdentityByAccessToken、获取用户身份关联数据表的主键getId、

获取auth_key的方法getAuthKey以及验证auth_key的方法validateAuthKey

<?php

namespace backend\models;

use Yii;
use yii\web\IdentityInterface;

/**
 * This is the model class for table "user_backend".
 *
 * @property integer $id
 * @property string $username
 * @property string $auth_key
 * @property string $password_hash
 * @property string $email
 * @property string $created_at
 * @property string $updated_at
 */
class UserBackend extends \yii\db\ActiveRecord implements IdentityInterface
{
    
    // 其他gii生成的代码,因为我们并未对其进行过改动,因此这里省略,下面只补充我们实现的几个抽象方法    

    /**
     * @inheritdoc
     * 根据user_backend表的主键(id)获取用户
     */
    public static function findIdentity($id)
    {
        return static::findOne(['id' => $id]);
    }

    /**
     * @inheritdoc
     * 根据access_token获取用户,我们暂时先不实现,我们在文章 http://www.manks.top/yii2-restful-api.html 有过实现,如果你感兴趣的话可以看看
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
    }

    /**
     * @inheritdoc
     * 用以标识 Yii::$app->user->id 的返回值
     */
    public function getId()
    {
        return $this->getPrimaryKey();
    }

    /**
     * @inheritdoc
     * 获取auth_key
     */
    public function getAuthKey()
    {
        return $this->auth_key;
    }

    /**
     * @inheritdoc
     * 验证auth_key
     */
    public function validateAuthKey($authKey)
    {
        return $this->getAuthKey() === $authKey;
    }
}

到这里呢,我们已经成功的指定了backend\models\UserBackend类为我们管理后台用户管理的类了!

由于下面需要讲的内容比较多,鉴于学习的积极性,我们下一章节再继续。下一节我们会实现利用user_backend表以及我们刚刚配置成功的用户组件实现后台管理用户的添加和登录机制,敬请期待!