当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-20 09:18:57 浏览: 评论:0 

本文实例讲述了YII2框架中自定义用户认证模型,完成登陆和注册操作,分享给大家供大家参考,具体如下:

有些时候我们需要自已定义用户类,操作自已建的用户表,来完成登陆和注册功能。

用户表结构如下,当然可以根据自已的需要添加或删除:

  1. CREATE TABLE `tb_user` ( 
  2.  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID'
  3.  `namevarchar(32) DEFAULT '' COMMENT '用户名'
  4.  `pwd` varchar(64) DEFAULT '' COMMENT '密码'
  5.  `head_img` varchar(256) DEFAULT '' COMMENT '图像'
  6.  `sex` tinyint(1) DEFAULT '0' COMMENT '性别(0:男,1:女)'
  7.  `age` tinyint(3) DEFAULT '0' COMMENT '年龄'
  8.  `auth_key` varchar(32) DEFAULT '' COMMENT '认证密钥'
  9.  PRIMARY KEY (`id`) 
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'

然后我们在models下创建MyUser.php,代码如下:

  1. <?php 
  2.  
  3. namespace app\models; 
  4.  
  5. use YII; 
  6. use yii\db\ActiveRecord; 
  7. use yii\web\IdentityInterface; 
  8.  
  9. //我们自定义自已的用户操作模型,需要实现IdentityInterface接口中的全部方法 
  10. //我们自定义的模型主要实现的是认证逻辑,而yii\web\User是负责管理用户认证状态的,两者是有区别的。 
  11. class MyUser extends ActiveRecord implements IdentityInterface 
  12.   //指定操作的表名 
  13.   public static function tableName() 
  14.   { 
  15.     return '{{%user}}'
  16.   } 
  17.  
  18.   //通过ID,返回用户实例 
  19.   public static function findIdentity($id
  20.   { 
  21.     return static::findOne($id); 
  22.   } 
  23.  
  24.   //通过令牌,返回用户实例,一般用于无状态的restful应用 
  25.   //如果你的应用不需要用到,直接留空就行 
  26.   public static function findIdentityByAccessToken($token$type = null) 
  27.   { 
  28.     return static::findOne(['access_token' => $token]); 
  29.   } 
  30.  
  31.   //通过用户名,返回用户实例 
  32.   public static function findByUsername($name
  33.   { 
  34.     return static::findOne(['name' => $name]); 
  35.   } 
  36.  
  37.   //获取用户ID 
  38.   public function getId() 
  39.   { 
  40.     return $this->id; 
  41.   } 
  42.  
  43.   //获取用户认证密钥 
  44.   public function getAuthKey() 
  45.   { 
  46.     return $this->auth_key; 
  47.   } 
  48.  
  49.   //生成cookie中的authkey 
  50.   public function generateAuthKey() 
  51.   { 
  52.     $this->auth_key = Yii::$app->security->generateRandomString(32); 
  53.     $this->save(false); 
  54.   } 
  55.  
  56.   //验证用户认证密钥 
  57.   public function validateAuthKey($authKey
  58.   { 
  59.     return $this->getAuthKey() === $authKey
  60.   } 
  61.  
  62.   //验证密码是否正确,当然我们也可以自已定义加密解密方式 
  63.   public function validatePassword($password
  64.   { 
  65.     return Yii::$app->security->validatePassword($password$this->pwd); 
  66.   } 

创建完我们自已的用户模型类后,我们需要在配置文件中修改成我们自已的,在config\web.php

  1. 'components' => [ 
  2.     // ... 
  3.     'user' => [ 
  4.         'identityClass' => 'app\models\MyUser'
  5.         'enableAutoLogin' => true, 
  6.     ], 
  7. ]; 

然后我们创建一个登陆页面

  1. <?php 
  2. use yii\helpers\Url; 
  3. ?> 
  4. <!doctype html> 
  5. <html lang="zh-CN"> 
  6. <head> 
  7.   <meta charset="UTF-8"> 
  8.   <title>表单提交</title> 
  9. </head> 
  10. <body> 
  11. <form action="<?php echo Url::toRoute('index/login'); ?>" method="post"> 
  12.   姓名:<input type="text" name="name"><br> 
  13.   密码:<input type="password" name="pwd"><br> 
  14.   <input type="submit" value="登陆"> 
  15.   <input name="_csrf" type="hidden" value="<?php echo \Yii::$app->request->csrfToken; ?>"> 
  16. </form> 
  17. </body> 
  18. </html> 

然后是处理用户登陆的,表单模型,在models下创建MyUserLogin.php

  1. <?php 
  2.  
  3. namespace app\models; 
  4.  
  5. use Yii; 
  6. use yii\base\Model; 
  7.  
  8. class MyUserLogin extends Model 
  9.   //注意这里要声明表单中提交过来的变量 
  10.   public $name
  11.   public $pwd
  12.  
  13.   //设置验证 
  14.   public function rules() 
  15.   { 
  16.     return [ 
  17.       [['name''pwd'], 'required'], 
  18.       ['pwd''validatePassword'], 
  19.     ]; 
  20.   } 
  21.  
  22.   //验证密码 
  23.   public function validatePassword($attribute$params
  24.   { 
  25.     if (!$this->hasErrors()) { 
  26.       $user = $this->getUser(); 
  27.  
  28.       if (!$user || !$user->validatePassword($this->pwd)) { 
  29.         $this->addError($attribute'密码错误'); 
  30.       } 
  31.     } 
  32.   } 
  33.  
  34.   //登陆处理 
  35.   public function login() 
  36.   { 
  37.     if ($this->validate()) { 
  38.       $user = $this->getUser(); 
  39.       //监听事件,登陆前,重新生成authkey 
  40.       YII::$app->user->on(\yii\web\User::EVENT_BEFORE_LOGIN, [$user'generateAuthKey']); 
  41.  
  42.       return Yii::$app->user->login($user, 3600 * 24); 
  43.     } 
  44.     return false; 
  45.   } 
  46.  
  47.   //获取用户 
  48.   public function getUser() 
  49.   { 
  50.     return MyUser::findByUsername($this->name); 
  51.   } 

最后就是我们的控制器代码

  1. <?php 
  2.  
  3. namespace app\controllers; 
  4.  
  5. use YII; 
  6. use yii\web\Controller; 
  7. use app\models\MyUserLogin; 
  8.  
  9. class IndexController extends Controller 
  10.   public function actionIndex() 
  11.   { 
  12.     //当前用户的ID 
  13.     var_dump(YII::$app->user->id); 
  14.     //当前用户是否是游客 
  15.     var_dump(YII::$app->user->isGuest); 
  16.   } 
  17.  
  18.   public function actionLogin() 
  19.   { 
  20.     if (YII::$app->request->isPost) { 
  21.  
  22.       $model = new MyUserLogin(); 
  23.       $model->load(YII::$app->request->post(), ''); 
  24.  
  25.       if ($model->login()) { 
  26.         echo '登陆成功'
  27.       } else { 
  28.         echo '登陆失败'
  29.       } 
  30.  
  31.     } else { 
  32.       return $this->renderPartial('login'); 
  33.     } 
  34.   } 

演示如下:

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

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

Tags: YII2自定义用户认证

分享到: