怎么在YII2框架中自定義用戶(hù)認(rèn)證模型-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在YII2框架中自定義用戶(hù)認(rèn)證模型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站長(zhǎng)期為上千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為弋江企業(yè)提供專(zhuān)業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè)弋江網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

用戶(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');
    }
  }
}

演示如下:

怎么在YII2框架中自定義用戶(hù)認(rèn)證模型

怎么在YII2框架中自定義用戶(hù)認(rèn)證模型

看完上述內(nèi)容,你們對(duì)怎么在YII2框架中自定義用戶(hù)認(rèn)證模型有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

本文標(biāo)題:怎么在YII2框架中自定義用戶(hù)認(rèn)證模型-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://bm7419.com/article34/cedgse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、企業(yè)網(wǎng)站制作外貿(mào)建站、電子商務(wù)網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司