• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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');
        }
      }
    }
    

    演示如下:

    更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • Yii2.0框架模型添加/修改/删除数据操作示例
    • Yii2.0框架模型多表关联查询示例
    • Yii中Model(模型)的创建及使用方法
    • yii框架表单模型使用及以数组形式提交表单数据示例
    • PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
    • PHP的Yii框架中Model模型的学习教程
    • Yii框架数据模型的验证规则rules()被执行的方法
    • YII动态模型(动态表名)支持分析
    • Yii框架表单模型和验证用法
    • Yii模型操作之criteria查找数据库的方法
    • Yii数据模型中rules类验证器用法分析
    • yii2.0框架多模型操作示例【添加/修改/删除】
    上一篇:YII2框架实现表单中上传单个文件的方法示例
    下一篇:YII2框架中分页组件的使用方法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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