1. 程式人生 > 程式設計 >YII2框架中自定義使用者認證模型,完成登陸和註冊操作示例

YII2框架中自定義使用者認證模型,完成登陸和註冊操作示例

本文例項講述了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');
    }
  }
}

演示如下:

YII2框架中自定義使用者認證模型,完成登陸和註冊操作示例

YII2框架中自定義使用者認證模型,完成登陸和註冊操作示例

更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。