YII2框架中自定義用戶認(rèn)證模型,完成登陸和注冊(cè)操作示例
本文實(shí)例講述了YII2框架中自定義用戶認(rèn)證模型,完成登陸和注冊(cè)操作。分享給大家供大家參考,具體如下:
有些時(shí)候我們需要自已定義用戶類,操作自已建的用戶表,來(lái)完成登陸和注冊(cè)功能。
用戶表結(jié)構(gòu)如下,當(dāng)然可以根據(jù)自已的需要添加或刪除:
CREATE TABLE `tb_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶ID', `name` varchar(32) DEFAULT '' COMMENT '用戶名', `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='用戶表';
然后我們?cè)趍odels下創(chuàng)建MyUser.php,代碼如下:
<?php namespace app\models; use YII; use yii\db\ActiveRecord; use yii\web\IdentityInterface; //我們自定義自已的用戶操作模型,需要實(shí)現(xiàn)IdentityInterface接口中的全部方法 //我們自定義的模型主要實(shí)現(xiàn)的是認(rèn)證邏輯,而yii\web\User是負(fù)責(zé)管理用戶認(rèn)證狀態(tài)的,兩者是有區(qū)別的。 class MyUser extends ActiveRecord implements IdentityInterface { //指定操作的表名 public static function tableName() { return '{{%user}}'; } //通過(guò)ID,返回用戶實(shí)例 public static function findIdentity($id) { return static::findOne($id); } //通過(guò)令牌,返回用戶實(shí)例,一般用于無(wú)狀態(tài)的restful應(yīng)用 //如果你的應(yīng)用不需要用到,直接留空就行 public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(['access_token' => $token]); } //通過(guò)用戶名,返回用戶實(shí)例 public static function findByUsername($name) { return static::findOne(['name' => $name]); } //獲取用戶ID public function getId() { return $this->id; } //獲取用戶認(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)證用戶認(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)建完我們自已的用戶模型類后,我們需要在配置文件中修改成我們自已的,在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>
然后是處理用戶登陸的,表單模型,在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)聽事件,登陸前,重新生成authkey YII::$app->user->on(\yii\web\User::EVENT_BEFORE_LOGIN, [$user, 'generateAuthKey']); return Yii::$app->user->login($user, 3600 * 24); } return false; } //獲取用戶 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)前用戶的ID var_dump(YII::$app->user->id); //當(dāng)前用戶是否是游客 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)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
- Yii2.0框架模型添加/修改/刪除數(shù)據(jù)操作示例
- Yii2.0框架模型多表關(guān)聯(lián)查詢示例
- Yii中Model(模型)的創(chuàng)建及使用方法
- yii框架表單模型使用及以數(shù)組形式提交表單數(shù)據(jù)示例
- PHP YII框架開發(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類驗(yàn)證器用法分析
- yii2.0框架多模型操作示例【添加/修改/刪除】
相關(guān)文章
基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼
當(dāng)雙方意見不統(tǒng)一的情況下,需要用投票達(dá)成協(xié)議,本文通過(guò)實(shí)例給大家介紹基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼,需要的朋友可以參考下2015-08-08php版微信公眾平臺(tái)之微信網(wǎng)頁(yè)登陸授權(quán)示例
這篇文章主要介紹了php版微信公眾平臺(tái)之微信網(wǎng)頁(yè)登陸授權(quán)的方法,結(jié)合實(shí)例形式分析了微信網(wǎng)頁(yè)登陸授權(quán)的接口調(diào)用及參數(shù)含義,需要的朋友可以參考下2016-09-09php項(xiàng)目接入xxl-job調(diào)度系統(tǒng)的示例詳解
這篇文章主要介紹了php項(xiàng)目接入xxl-job調(diào)度系統(tǒng)的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12微信小程序頁(yè)面向下滾動(dòng)時(shí)tab欄固定頁(yè)面頂部實(shí)例講解
這篇文章主要介紹了微信小程序頁(yè)面向下滾動(dòng)時(shí)tab欄固定頁(yè)面頂部實(shí)例講解,文中圖文實(shí)例講解的很透徹,有需要的同學(xué)可以參考下2021-03-03php將數(shù)據(jù)庫(kù)中的電話號(hào)碼讀取出來(lái)并生成圖片
本PHP程序作用是從數(shù)據(jù)庫(kù)中讀取出手機(jī)號(hào)碼或其他數(shù)據(jù)并生成圖片,起到干擾采集防采集的作用。(英文或數(shù)字,如果要支持中文的話需要額外添加字庫(kù))。本代碼為原創(chuàng)代碼。2008-08-08PHP 抓取新浪讀書頻道的小說(shuō)并生成txt電子書的代碼
想看什么電子書,先去新浪讀書搜索,然后填入對(duì)應(yīng)的參數(shù)即可2009-12-12