YII2框架中自定義使用者認證模型,完成登陸和註冊操作示例
阿新 • • 發佈:2020-03-13
本文例項講述了YII2框架中自定義使用者認證模型,完成登陸和註冊操作。分享給大家供大家參考,具體如下:
有些時候我們需要自已定義使用者類,操作自已建的使用者表,來完成登陸和註冊功能。
使用者表結構如下,當然可以根據自已的需要新增或刪除:
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 '認證金鑰',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='使用者表';
然後我們在models下建立MyUser.php,程式碼如下:
<?php namespace app\models; use YII; use yii\db\ActiveRecord; use yii\web\IdentityInterface; //我們自定義自已的使用者操作模型,需要實現IdentityInterface介面中的全部方法 //我們自定義的模型主要實現的是認證邏輯,而yii\web\User是負責管理使用者認證狀態的,兩者是有區別的。 class MyUser extends ActiveRecord implements IdentityInterface { //指定操作的表名 public static function tableName() { return '{{%user}}'; } //通過ID,返回使用者例項 public static function findIdentity($id) { return static::findOne($id); } //通過令牌,返回使用者例項,一般用於無狀態的restful應用 //如果你的應用不需要用到,直接留空就行 public static function findIdentityByAccessToken($token,$type = null) { return static::findOne(['access_token' => $token]); } //通過使用者名稱,返回使用者例項 public static function findByUsername($name) { return static::findOne(['name' => $name]); } //獲取使用者ID public function getId() { return $this->id; } //獲取使用者認證金鑰 public function getAuthKey() { return $this->auth_key; } //生成cookie中的authkey public function generateAuthKey() { $this->auth_key = Yii::$app->security->generateRandomString(32); $this->save(false); } //驗證使用者認證金鑰 public function validateAuthKey($authKey) { return $this->getAuthKey() === $authKey; } //驗證密碼是否正確,當然我們也可以自已定義加密解密方式 public function validatePassword($password) { return Yii::$app->security->validatePassword($password,$this->pwd); } }
建立完我們自已的使用者模型類後,我們需要在配置檔案中修改成我們自已的,在config\web.php
'components' => [ // ... 'user' => [ 'identityClass' => 'app\models\MyUser','enableAutoLogin' => true,],];
然後我們建立一個登陸頁面
<?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下建立MyUserLogin.php
<?php namespace app\models; use Yii; use yii\base\Model; class MyUserLogin extends Model { //注意這裡要宣告表單中提交過來的變數 public $name; public $pwd; //設定驗證 public function rules() { return [ [['name','pwd'],'required'],['pwd','validatePassword'],]; } //驗證密碼 public function validatePassword($attribute,$params) { if (!$this->hasErrors()) { $user = $this->getUser(); if (!$user || !$user->validatePassword($this->pwd)) { $this->addError($attribute,'密碼錯誤'); } } } //登陸處理 public function login() { if ($this->validate()) { $user = $this->getUser(); //監聽事件,登陸前,重新生成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() { //當前使用者的ID var_dump(YII::$app->user->id); //當前使用者是否是遊客 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'); } } }
演示如下:
更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》
希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。