本文實(shí)例講述了YII2框架中自定義用戶(hù)認(rèn)證模型,完成登陸和注冊(cè)操作。分享給大家供大家參考,具體如下:
有些時(shí)候我們需要自已定義用戶(hù)類(lèi),操作自已建的用戶(hù)表,來(lái)完成登陸和注冊(cè)功能。
用戶(hù)表結(jié)構(gòu)如下,當(dāng)然可以根據(jù)自已的需要添加或刪除:
CREATE TABLE `tb_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶(hù)ID',
`name` varchar(32) DEFAULT '' COMMENT '用戶(hù)名',
`pwd` varchar(64) DEFAULT '' COMMENT '密碼',
`head_img` varchar(256) DEFAULT '' COMMENT '圖像',
`sex` tinyint(1) DEFAULT '0' COMMENT '性別(0:男,1:女)',
`age` tinyint(3) DEFAULT '0' COMMENT '年齡',
`auth_key` varchar(32) DEFAULT '' COMMENT '認(rèn)證密鑰',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶(hù)表';
然后我們?cè)趍odels下創(chuàng)建MyUser.php,代碼如下:
?php
namespace app\models;
use YII;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
//我們自定義自已的用戶(hù)操作模型,需要實(shí)現(xiàn)IdentityInterface接口中的全部方法
//我們自定義的模型主要實(shí)現(xiàn)的是認(rèn)證邏輯,而yii\web\User是負(fù)責(zé)管理用戶(hù)認(rèn)證狀態(tài)的,兩者是有區(qū)別的。
class MyUser extends ActiveRecord implements IdentityInterface
{
//指定操作的表名
public static function tableName()
{
return '{{%user}}';
}
//通過(guò)ID,返回用戶(hù)實(shí)例
public static function findIdentity($id)
{
return static::findOne($id);
}
//通過(guò)令牌,返回用戶(hù)實(shí)例,一般用于無(wú)狀態(tài)的restful應(yīng)用
//如果你的應(yīng)用不需要用到,直接留空就行
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
//通過(guò)用戶(hù)名,返回用戶(hù)實(shí)例
public static function findByUsername($name)
{
return static::findOne(['name' => $name]);
}
//獲取用戶(hù)ID
public function getId()
{
return $this->id;
}
//獲取用戶(hù)認(rèn)證密鑰
public function getAuthKey()
{
return $this->auth_key;
}
//生成cookie中的authkey
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString(32);
$this->save(false);
}
//驗(yàn)證用戶(hù)認(rèn)證密鑰
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
//驗(yàn)證密碼是否正確,當(dāng)然我們也可以自已定義加密解密方式
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->pwd);
}
}
創(chuàng)建完我們自已的用戶(hù)模型類(lèi)后,我們需要在配置文件中修改成我們自已的,在config\web.php
'components' => [
// ...
'user' => [
'identityClass' => 'app\models\MyUser',
'enableAutoLogin' => true,
],
];
然后我們創(chuàng)建一個(gè)登陸頁(yè)面
?php
use yii\helpers\Url;
?>
!doctype html>
html lang="zh-CN">
head>
meta charset="UTF-8">
title>表單提交/title>
/head>
body>
form action="?php echo Url::toRoute('index/login'); ?>" method="post">
姓名:input type="text" name="name">br>
密碼:input type="password" name="pwd">br>
input type="submit" value="登陸">
input name="_csrf" type="hidden" value="?php echo \Yii::$app->request->csrfToken; ?>">
/form>
/body>
/html>
然后是處理用戶(hù)登陸的,表單模型,在models下創(chuàng)建MyUserLogin.php
?php
namespace app\models;
use Yii;
use yii\base\Model;
class MyUserLogin extends Model
{
//注意這里要聲明表單中提交過(guò)來(lái)的變量
public $name;
public $pwd;
//設(shè)置驗(yàn)證
public function rules()
{
return [
[['name', 'pwd'], 'required'],
['pwd', 'validatePassword'],
];
}
//驗(yàn)證密碼
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->pwd)) {
$this->addError($attribute, '密碼錯(cuò)誤');
}
}
}
//登陸處理
public function login()
{
if ($this->validate()) {
$user = $this->getUser();
//監(jiān)聽(tīng)事件,登陸前,重新生成authkey
YII::$app->user->on(\yii\web\User::EVENT_BEFORE_LOGIN, [$user, 'generateAuthKey']);
return Yii::$app->user->login($user, 3600 * 24);
}
return false;
}
//獲取用戶(hù)
public function getUser()
{
return MyUser::findByUsername($this->name);
}
}
最后就是我們的控制器代碼
?php
namespace app\controllers;
use YII;
use yii\web\Controller;
use app\models\MyUserLogin;
class IndexController extends Controller
{
public function actionIndex()
{
//當(dāng)前用戶(hù)的ID
var_dump(YII::$app->user->id);
//當(dāng)前用戶(hù)是否是游客
var_dump(YII::$app->user->isGuest);
}
public function actionLogin()
{
if (YII::$app->request->isPost) {
$model = new MyUserLogin();
$model->load(YII::$app->request->post(), '');
if ($model->login()) {
echo '登陸成功';
} else {
echo '登陸失敗';
}
} else {
return $this->renderPartial('login');
}
}
}
演示如下:


更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Yii框架入門(mén)及常用技巧總結(jié)》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《smarty模板入門(mén)基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- Yii2.0框架模型添加/修改/刪除數(shù)據(jù)操作示例
- Yii2.0框架模型多表關(guān)聯(lián)查詢(xún)示例
- Yii中Model(模型)的創(chuàng)建及使用方法
- yii框架表單模型使用及以數(shù)組形式提交表單數(shù)據(jù)示例
- PHP YII框架開(kāi)發(fā)小技巧之模型(models)中rules自定義驗(yàn)證規(guī)則
- PHP的Yii框架中Model模型的學(xué)習(xí)教程
- Yii框架數(shù)據(jù)模型的驗(yàn)證規(guī)則rules()被執(zhí)行的方法
- YII動(dòng)態(tài)模型(動(dòng)態(tài)表名)支持分析
- Yii框架表單模型和驗(yàn)證用法
- Yii模型操作之criteria查找數(shù)據(jù)庫(kù)的方法
- Yii數(shù)據(jù)模型中rules類(lèi)驗(yàn)證器用法分析
- yii2.0框架多模型操作示例【添加/修改/刪除】