为什么80%的码农都做不了架构师?>>>   

作者:白狼 出处:http://www.manks.top/document/yii2-user.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

上一章节我们讲述了如何通过新建数据模型来配置yii2的user组件,但是课后有小伙伴发来问卷,为啥在创建user_backend数据表的时候销毁了 password_reset_token 字段呢?其实这个字段对后台管理基本没啥子用,你要是非要,也可以,这里只对该字段以及用途做一个说明,课后需要的可以自行实现。

该字段具有唯一性,其用途在于用户找回密码。且该字段具有时效性,过期时间参考common\config\params.php文件的user.passwordResetTokenExpire项配置,过期时间默认是1小时。注意哦,默认的找回密码是基于邮件且发送的链接内容包含该字段,用于点击链接跳转后可根据该字段获取到具体用户并实现用户密码的修改。因为看起来还是蛮繁琐的,如果你没听懂,可以在【小站】​注册一个帐号,通过邮件找回密码测试一番。

因此,考虑到我们后台,无需这么繁琐,后面我们增加一个密码重置的功能,让用于自行修改密码即可。

说了那么多,我们接着上一章节,来说一说如何通过新建的数据表以及user组件来创建一个新的用户,以及如何实现新用户的登录机制。

其实也是so easy的,跟着步骤走,操作起来简单易学,一学就会,简直不能再6!

新用户的创建 打开 index.php?r=user-backend 页面,我们发现有一个创建的按钮,当然,如果我们真的这么创建了,创建的用户肯定是废的,因为肯定不能登录嘛!至少密码我们这里没有加密吧,对不对?

接下来我们就来实现添加一个新用户的操作,然后一并实现其登陆的操作。

①、我们将【创建】的按钮改为【添加新用户】,并修改其对应的链接地址

<?= Html::a('添加新用户', ['signup'], ['class' => 'btn btn-success']) ?>

可以看到这里我们命名当前控制器的signup操作为添加新用户的操作,接着我们就去实现掉这个操作。

②、实现signup方法,注意哦,我们需要实现两步,分别是渲染添加用户的表单和处理表单提交的数据。

/***  create new user*/
public function actionSignup ()
{$model = new \backend\models\SignupForm();// 如果是post提交且有对提交的数据校验成功(我们在SignupForm的signup方法进行了实现)// $model->load() 方法,实质是把post过来的数据赋值给model// $model->signup() 方法, 是我们要实现的具体的添加用户操作if ($model->load(Yii::$app->request->post()) && $model->signup()) {return $this->redirect(['index']);}// 渲染添加新用户的表单return $this->render('signup', ['model' => $model,]);
}

③、我们来看下渲染的表单文件signup.php,默认的视图文件存放在 views/user-backend/ 目录下,可以看到我们的表单页面是用bootstrap构建的,这样样式问题就不需要担心了。

<?php/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \backend\models\SignupForm */use yii\helpers\Html;
use yii\bootstrap\ActiveForm;$this->title = '添加新用户';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-signup"><div class="row"><div class="col-lg-5"><?php $form = ActiveForm::begin(['id' => 'form-signup']); ?><?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?><?= $form->field($model, 'email') ?><?= $form->field($model, 'password')->passwordInput() ?><div class="form-group"><?= Html::submitButton('添加', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?></div><?php ActiveForm::end(); ?></div></div>
</div>

④、从第②、③步来看,我们紧接着要实现的是Signupform的signup方法,该方法的含义是把接收到的表单数据进行过滤验证然后入库操作。你不可能直接就把用户提交过来的数据直接入库了,比方说邮箱不合法呢?对表单的认证在yii2中操作起来是非常方便的,是需要配置model的rules规则即可。那有些人要问了,我的规则配置好了,什么时候校验呢?这个很简单,你只需要在数据入库之前调用一下model的validate方法或者save方法(save方法内部会调用validate方法)即可。

<?php
namespace backend\models;
use yii\base\Model;
use backend\models\UserBackend;/*** Signup form*/
class SignupForm extends Model
{public $username;public $email;public $password;/*** @inheritdoc* 对数据的校验规则*/public function rules(){return [// 对username的值进行两边去空格过滤['username', 'filter', 'filter' => 'trim'],// required表示必须的,也就是说表单提交过来的值必须要有, message 是username不满足required规则时给的提示消息['username', 'required', 'message' => '用户名不可以为空'],// unique表示唯一性,targetClass表示的数据模型 这里就是说UserBackend模型对应的数据表字段username必须唯一['username', 'unique', 'targetClass' => '\backend\models\UserBackend', 'message' => '用户名已存在.'],// string 字符串,这里我们限定的意思就是username至少包含2个字符,最多255个字符['username', 'string', 'min' => 2, 'max' => 255],// 下面的规则基本上都同上,不解释了['email', 'filter', 'filter' => 'trim'],['email', 'required', 'message' => '邮箱不可以唯恐'],['email', 'email'],['email', 'string', 'max' => 255],['email', 'unique', 'targetClass' => '\backend\models\UserBackend', 'message' => 'email已经被设置了.'],['password', 'required', 'message' => '密码不可以为空'],['password', 'string', 'min' => 6, 'tooShort' => '密码至少填写6位'],   // default 默认在没有数据的时候才会进行赋值[['created_at', 'updated_at'], 'default', 'value' => date('Y-m-d H:i:s')],];}/*** Signs user up.** @return true|false 添加成功或者添加失败*/public function signup(){// 调用validate方法对表单数据进行验证,验证规则参考上面的rules方法if (!$this->validate()) {return null;}// 实现数据入库操作$user = new UserBackend();$user->username = $this->username;$user->email = $this->email;// 设置密码,密码肯定要加密,暂时我们还没有实现,看下面我们有实现的代码$user->setPassword($this->password);// 生成 "remember me" 认证key$user->generateAuthKey();// save(false)的意思是:不调用UserBackend的rules再做校验并实现数据入库操作// 这里这个false如果不加,save底层会调用UserBackend的rules方法再对数据进行一次校验,因为我们上面已经调用Signup的rules校验过了,这里就没必要在用UserBackend的rules校验了return $user->save(false);}
}

⑤、我们在SignupForm的signup操作中看到,需要实现UserBackend的setPassword和generateAuthKey方法,我们打开backend\models\UserBackend.php文件新增下面两个方法

/*** 为model的password_hash字段生成密码的hash值** @param string $password*/public function setPassword($password){$this->password_hash = Yii::$app->security->generatePasswordHash($password);}/*** 生成 "remember me" 认证key*/public function generateAuthKey(){$this->auth_key = Yii::$app->security->generateRandomString();}

现在我们添加新用户的界面是下面这样的(图见原文) 接着我们测试下添加一个新用户test1,发现也是可以的。(图见原文) 暂停一下,说了那么多,我们先回过头来缕缕实现的逻辑(分析图见原文)

登录的实现

[考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导!]

查看原文

转载于:https://my.oschina.net/manks/blog/744877

yii2项目实战-用户管理之登录与注册功能实现相关推荐

  1. Django项目实战 ----用户使用QQ登录

    QQ登录流程 点击前端QQ登录的请求按钮,弹出扫码页面,用于手机扫码授权 如果之前登录过,那么就直接登录成功 如果是第一次使用QQ登录,会提示绑定之前的账号或者输入手机号 QQ登录流程准备的配置工作 ...

  2. yii2项目实战-博客管理平台的搭建

    登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 返回通知列表 下一条 上一条 分享资讯 传PPT/文档 提问题 写博客 传资源 创建项目 创建代码片 ...

  3. vue 3 项目实战一(绘制登录界面)

    目录 一.概述 二.创建vue项目 三.需求分析 四.构建组件 五.vue组件之间的通信 一.概述 本文记录了项目实现的详细步骤以及原理,十分适合初学vue的萌新练手,也是阶段性学习的一个总结,可能会 ...

  4. 【Java从0到架构师】项目实战 - 会话管理、EhCache、JWT、权限管理 Shiro、打包部署

    项目实战 - 权限管理 会话管理 客户端身份认证 - 基于 Cookie.Session 客户端身份验证 - 基于 token EhCache - 简单的缓存框架 JWT - 基于 JSON 的 to ...

  5. Django项目实战——用户投票系统(三)

    Django项目实战--用户投票系统(三) 承接上文 官方文档链接附上: 编写你的第一个 Django 应用,第 3 部分 | Django 文档 | Django (djangoproject.co ...

  6. 复习Java第二个项目仿QQ聊天系统 03(两种通信类、登录以及注册功能完善) Java面试题并发编程相关知识生活【记录一个咸鱼大学生三个月的奋进生活】025

    记录一个咸鱼大学生三个月的奋进生活025 复习Java(仿QQ聊天系统03两种通信类.登录以及注册功能完善) TcpSocket类(与服务器进行通信) Server类(服务器类) TcpMessage ...

  7. 用python写注册登录界面web_用Python实现web端用户登录和注册功能

    这篇文章主要介绍了用Python实现web端用户登录和注册功能的教程,需要的朋友可以参考下 用户管理是绝大部分Web网站都需要解决的问题.用户管理涉及到用户注册和登录. 用户注册相对简单,我们可以先通 ...

  8. python123注册登录_用Python实现web端用户登录和注册功能的教程

    用户管理是绝大部分Web网站都需要解决的问题.用户管理涉及到用户注册和登录. 用户注册相对简单,我们可以先通过API把用户注册这个功能实现了: _RE_MD5 = re.compile(r'^[0-9 ...

  9. Spring Boot + vue-element 开发个人博客项目实战教程(十三、文章标签功能实现)

    ⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot + vue-element 开发个人博客项目实战教程 ⭐专栏内容:零基础学Java.个人博客系统 项目部署视频 https://www.bi ...

最新文章

  1. leetcode--字符串转换为整数--python
  2. 大型网站技术架构(二)架构模式
  3. 利用Attribute特性简化多查询条件拼接sql语句的麻烦
  4. Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化
  5. 汇编语言--不可屏蔽中断
  6. 文件存取方式是哪两种python_常用的Python存储方式有哪些?
  7. Python3 爬虫学习笔记 C10【数据储存系列 — MySQL】
  8. API 接口设计中 Token 类型的分类与设计
  9. 物质之学 —— 金属
  10. 微软将VB和C#合二为一 年底推出全新平台VS2010
  11. 电视机魔百盒显示连接服务器失败,【当贝市场】魔百盒EPG主页加载不出来办法详解...
  12. 利用MATLAB实现对一幅彩色图像的高斯滤波(不采用MATLAB函数)。
  13. Eslint:Parsing error: The keyword ‘interface‘ is reserved
  14. 计算机在智能交通应用,计算机信息技术在智能交通系统中的应用
  15. 干货!ERP在企业财务管理中的应用问题分析与解决办法
  16. java 媒体框架_Java 媒体框架 之 JMF
  17. Geth的安装与配置(Windows版)
  18. php --interface接口的使用方法
  19. ​2021半年盘点,不想你错过的重磅新书
  20. html中计时器,计时器.html

热门文章

  1. 进行短视频app开发工作时,可以加入它来保护青少年...
  2. 分布式 RPC 框架
  3. CentOS6 修改主机名的规范步骤
  4. 51nod 最大M子段和系列
  5. 光热发电未来或成长为南非电力供应市场的主力军
  6. 网页调用本地播放器的代码支持ie,chroome, 火狐不支持
  7. Dialplan 编程基础
  8. ??征集Sql Server2005设置Windows集成认证资料
  9. paramiko向服务器自动上传下载文件
  10. Laravel之Eloquent ORM