yii2项目实战-用户管理之user组件的配置

我们在上一小节中借助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文件)创建如下数据表

1
2
3
4
5
6
7
8
9
10
11
12
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的使用做过讲解,这里就一带而过不细说了。

此时你的项目应该多了下面几个文件

1
2
3
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 支持管理后台的登录注册功能,我们需要对其做一个简单的配置,包括下面这几个操作步骤

①、配置下用户认证类 user组件的 identityClass属性, identityClass 对应的类可重要了,直接掌管用户组件的认证大全。

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

1
2
3
4
5
6
'components' => [
'user' => [
'identityClass' => 'backend\models\UserBackend',
'enableAutoLogin' => true,
],
],

补充:有同学注意到这里的user组件并没有指定class项,这有点神奇不是吗?我们在【配置】一文中说大部分的组件都需要指定class项,为啥这么重要的组件却没有呢?

其实不是没有,在yii2中,有这么几个核心的重要组件,其对应的class属性都是内置的。比如user组件,它其实对应的class就是 yii\web\User 类。即 Yii::$app->user 是 yii\web\User 类的实例,并不是identityClass的实例哦,这点需要弄清楚。

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

打开 common\models\LoginForm.php 文件,找到getUser方法,这里的User类使用的还是 common\models\User 类,这里我们修改为刚刚配置的认证类 UserBackend

1
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?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表以及我们刚刚配置成功的用户认证类实现后台管理用户的添加和登录机制,敬请期待哦!