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中自定义用户认证模型,完成登陆和注册的更多相关文章
- 使用django实现自定义用户认证
参考资料:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/ 直接拉到最后看栗子啦 django自定义用户认证(使用自 ...
- Django 中自定义用户模型及集成认证授权功能总结
1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...
- Django自定义用户认证系统之自定义用户模型
参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...
- Django 中的用户认证
Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...
- CMDB资产管理系统开发【day25】:Django 自定义用户认证
官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...
- Django自定义用户认证
自定义一个用户认证 详细参考官方文档: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.au ...
- 43)django-用户认证,授权,自定义用户认证
##用户认证 django自带用户认证系统,包括认证和授权.用户认证系统由用户,权限,用户组,密码,cookie和session给组成. ###用户认证系统设置 #settings.py INSTAL ...
- spring Security的自定义用户认证
首先我需要在xml文件中声明.我要进行自定义用户的认证类,也就是我要自己从数据库中进行查询 <http pattern="/*.html" security="no ...
- 自定义用户认证(继承django的)
1.在app下创建一个自己用户认证文件,文件名随意,记得为.py文件 2.编辑该userauth.py文件 #!/usr/bin/env python #coding:utf-8 from djang ...
随机推荐
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...
- RabbitMQ系列教程之四:路由(Routing)(转载)
RabbitMQ系列教程之四:路由(Routing) (使用Net客户端) 在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ...
- IIS Express
当前程序员只能通过下面两种web服务器之一来开发和测试ASP.NET网站程序: 1. Visual Studio自带的ASP.NET开发服务器(webdev.exe). 2. Windows自带的II ...
- 二叉堆复习(包括d堆)
要期中考了……我真的是什么也不会啊,书都没看过TAT. 好吧整理一下二叉堆,这里就以最大堆为例好了. 首先二叉堆其实是一棵CBT,满足父节点的键值大于左右子节点的键值(wikipedia把这个叫键值, ...
- linux下给PHP安装拓展
要先完成了上一篇文章的phpize的操作,并激活它才能下一步. 下载拓展,在http://pecl.php.net/这个网站下载,其他的有可能不成功,我之前还很纳闷phpize已经调试通过了,但是切换 ...
- php 查看当前页中的post及get数据
file_put_contents("log1209.html",date('Y-m-d H:i:s ')."-----<br>",FILE_APP ...
- gitlab jenkins 自动构建
工作中有这样一种需求: 每次提交代码之后,都自动执行 单元测试脚本,进行单元测试 jenkins监听项目的某个分支,设置运行脚本,设置一个url作为回调 利用gitlab的钩子,在每次有提交之后,触发 ...
- serclet监听器
1:监听servlet上下文 2:监听会话 3:监听请求 使用,必须是实现对应的接口,然后在web.xml中配置自己写的监听器的实现类 过滤器之后,servlet之前(有待深入研究) 下一集预告:过滤 ...
- Kubernetes 本地仓库
1.Kubernetes本地私有仓库 Docker仓库主要用于存放Docker镜像,Docker仓库分为公共仓库和私有仓库,基于registry可以搭建本地私有仓库.使用私有仓库有如下优点: 1)节省 ...
- ubuntu14配置opencv3.4.1(转)
网站:https://blog.csdn.net/a1429331875/article/details/31539129 写此博客的目的是为了方便大家的学习,我是搞了半天,通过上网查找资料才成功的. ...