YII2框架中自定义用户认证模型,完成登陆和注册操作示例
程序员文章站
2022-07-12 08:32:19
本文实例讲述了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'); } } }
演示如下: