欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

YII2框架中自定义用户认证模型,完成登陆和注册操作示例

程序员文章站 2023-11-21 20:10:28
本文实例讲述了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框架中自定义用户认证模型,完成登陆和注册操作示例