这两天空的时候,看了下Yii2,然后按照官方教程,安装了Yii2基础版。最开始的问题,无非就是注册登陆等功能了,果然,Yii2基础版并不像高级版一样,可以直接导入创建好的数据库,只有的静态登陆模型。然后简单修改了下,实现动态登陆,在这里记录下。
一、Yii2基础版的登录思路
1、登录表单--》执行controller、action--》调用$model->load()=》调用$model->login()($model->login()来自于LoginForm)
2、$this->validate()验证,也就是基础的rule验证,rule验证中带有validatePassword验证,即会执行User::validatePassword()
3、验证通过,返回用户对象,验证失败,返回错误。
二、简单看了下Yii2的登录流程,知道怎么做了,那就开始动手修改吧。
按照需求创建user用户表
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
`email` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL,
`authKey` varchar(100) NOT NULL DEFAULT '',
`accessToken` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
注:你需要先配置好数据库连接,确保能正确连接数据库。以上字段可以根据你需求进行扩充,这里仅作演示使用。
三、修改登录时候的部分逻辑调用
通过第一步看清楚Yii2基础版的思路,它是调用的静态数组来验证的,我们要修改成动态的,Yii2对用户的验证调用都放在models/User.php下面,那么,我们就修改这个文件,代码如下:
<?php
namespace app\models;
use Yii;
class User extends \yii\base\Object implements \yii\web\IdentityInterface {
public $id;
public $username;
public $email;
public $password;
public $status;
public $authKey;
public $accessToken;
//public $created_at;
//public $updated_at;
/**
* @inheritdoc
*/
public static function findIdentity($id) {
$user = self::findById($id);
if ($user) {
return new static($user);
}
return null;
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null) {
$user = Users::find()->where(array('accessToken' => $token))->one();
if ($user) {
return new static($user);
}
return null;
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username) {
$user = Users::find()->where(array('username' => $username))->one();
if ($user) {
return new static($user);
}
return null;
}
public static function findById($id) {
$user = Users::find()->where(array('id' => $id))->asArray()->one();
if ($user) {
return new static($user);
}
return null;
}
/**
* @inheritdoc
*/
public function getId() {
return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey() {
return $this->authKey;
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey) {
return $this->authKey === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
* 在创建用户的时候,也需要对密码进行操作
*/
public function validatePassword($password) {
//方法一:使用自带的加密方式
return $this->password === md5($password);
//方法二:通过YII自带的验证方式来验证hash是否正确
//return Yii::$app->getSecurity()->validatePassword($password, $this->password);
}
}
从以上代码可以看出,我们只是修改了对用户表的操作调用,密码对比,ValidatePassword($password)方法中,就是密码验证,你可以写自己的密码加密验证方式,也可以使用Yii自带的加密验证方式。(无论你使用哪种密码验证方式,当你创建用户的时候,也需要使用这种加密验证方式哦)
四、创建User::调用
为了让代码干净一点,我创建了models/Users.php,因为Users::需要使用
$user = Users::find()->where(array('accessToken' => $token))->one();
models/Users.php代码如下:
<?php
/*
* 用户表
*/
namespace app\models;
use yii\db\ActiveRecord;
use Yii;
class Users extends \yii\db\ActiveRecord {
/**
* @return string 返回该AR类关联的数据表名
*/
public static function tableName() {
return 'user';
}
}
备注:如果你不想创建多余的Users.php文件,你还可以使用其他方法,当然,代码稍微不同,这里就不详细讲解
1、你可以直接让User.php继承\yii\db\ActiveRecord。继承代码如下
<?php
namespace app\models;
class User extends /*\yii\base\Object*/ \yii\db\ActiveRecord implements \yii\web\IdentityInterface
2、你甚至可以使用Yii2的基础SQL查询
到这里,就完成了Yii2基础版的登录注册了