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

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

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中自定义用户认证模型,完成登陆和注册的更多相关文章

  1. 使用django实现自定义用户认证

    参考资料:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/    直接拉到最后看栗子啦 django自定义用户认证(使用自 ...

  2. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  3. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  4. Django 中的用户认证

    Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...

  5. CMDB资产管理系统开发【day25】:Django 自定义用户认证

    官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...

  6. Django自定义用户认证

    自定义一个用户认证 详细参考官方文档: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.au ...

  7. 43)django-用户认证,授权,自定义用户认证

    ##用户认证 django自带用户认证系统,包括认证和授权.用户认证系统由用户,权限,用户组,密码,cookie和session给组成. ###用户认证系统设置 #settings.py INSTAL ...

  8. spring Security的自定义用户认证

    首先我需要在xml文件中声明.我要进行自定义用户的认证类,也就是我要自己从数据库中进行查询 <http pattern="/*.html" security="no ...

  9. 自定义用户认证(继承django的)

    1.在app下创建一个自己用户认证文件,文件名随意,记得为.py文件 2.编辑该userauth.py文件 #!/usr/bin/env python #coding:utf-8 from djang ...

随机推荐

  1. C++指针理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  2. 国内Maven仓库 - 2018年5月2日15:54:10

    <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> & ...

  3. 吴裕雄 28-MySQL 序列使用

    MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现 使用AUTO_INCREMENTMySQ ...

  4. hdu3826-Squarefree number-(欧拉筛+唯一分解定理)

    Squarefree number Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. tomcat支持 https

    首先 安装nginx  ,在nginx.conf 中引入 include /app/conf/nginx/vhosts/*.conf; 配置 并在conf/vhosts 目录 中配置virtual.c ...

  6. spring 解耦

    spring之后不用在类中new一个实体,而是在类中申明接口类:当真正使用的时候是注入相应的实现类,要什么类注入申明类:那么这样就面向接口编程了:耦合度大大降低: 同时spring有面向切面编程,其实 ...

  7. linux配置虚拟域名

    linux环境下面配置虚拟主机域名 第一步:在root目录下面(即根目录)ls(查看文件)cd进入etc目录find hosts文件vi hosts 打开hosts文件并进行编辑在打开的文件最下面添加 ...

  8. numpy中的数学

    1.dot,exp v = np.dot(arg1,arg2) #矩阵乘法 v2 = np.exp() # e的-x 次方

  9. versionCode & versionName

    [versionCode & versionName] Android的版本可以在androidmainfest.xml中定义,主要有android:versionCode和android:v ...

  10. jdbc连接mysql/oracle数据库

    driver-class-name : com.mysql.jdbc.Driver url : jdbc:mysql://localhost:3306/数据库名 username:   root pa ...