文档章节

Yii2如何实现用户登陆

卖小女孩的小火柴
 卖小女孩的小火柴
发布于 2015/04/11 19:48
字数 936
阅读 19133
收藏 23

这两天空的时候,看了下Yii2,然后按照官方教程,安装了Yii2基础版。最开始的问题,无非就是注册登陆等功能了,果然,Yii2基础版并不像高级版一样,可以直接导入创建好的数据库,只有的静态登陆模型。然后简单修改了下,实现动态登陆,在这里记录下。

一、Yii2基础版的登录思路

1、登录表单--》执行controller、action--》调用$model->load()=》调用$model->login()($model->login()来自于LoginForm

2、$this->validate()验证,也就是基础的rule验证,rule验证中带有validatePassword验证,即会执行User::validatePassword()

3、验证通过,返回用户对象,验证失败,返回错误。


二、简单看了下Yii2的登录流程,知道怎么做了,那就开始动手修改吧。

按照需求创建user用户表

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `email` varchar(32) NOT NULL,
  `password` varchar(32) NOT NULL,
  `authKey` varchar(100) NOT NULL DEFAULT '',
  `accessToken` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

注:你需要先配置好数据库连接,确保能正确连接数据库。以上字段可以根据你需求进行扩充,这里仅作演示使用。


三、修改登录时候的部分逻辑调用

通过第一步看清楚Yii2基础版的思路,它是调用的静态数组来验证的,我们要修改成动态的,Yii2对用户的验证调用都放在models/User.php下面,那么,我们就修改这个文件,代码如下:

<?php

namespace app\models;

use Yii;

class User extends \yii\base\Object implements \yii\web\IdentityInterface {

    public $id;
    public $username;
    public $email;
    public $password;
    public $status;
    public $authKey;
    public $accessToken;
    //public $created_at;
    //public $updated_at;

    /**
     * @inheritdoc
     */
    public static function findIdentity($id) {
        $user = self::findById($id);
        if ($user) {
            return new static($user);
        }
        return null;
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null) {
        $user = Users::find()->where(array('accessToken' => $token))->one();
        if ($user) {
            return new static($user);
        }
        return null;
    }

    /**
     * Finds user by username
     *
     * @param  string      $username
     * @return static|null
     */
    public static function findByUsername($username) {
        $user = Users::find()->where(array('username' => $username))->one();
        if ($user) {
            return new static($user);
        }

        return null;
    }

    public static function findById($id) {
        $user = Users::find()->where(array('id' => $id))->asArray()->one();
        if ($user) {
            return new static($user);
        }

        return null;
    }

    /**
     * @inheritdoc
     */
    public function getId() {
        return $this->id;
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey() {
        return $this->authKey;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey) {
        return $this->authKey === $authKey;
    }

    /**
     * Validates password
     *
     * @param  string  $password password to validate
     * @return boolean if password provided is valid for current user
     * 在创建用户的时候,也需要对密码进行操作
     */
    public function validatePassword($password) {
        //方法一:使用自带的加密方式
        return $this->password === md5($password);

        //方法二:通过YII自带的验证方式来验证hash是否正确
        //return Yii::$app->getSecurity()->validatePassword($password, $this->password);
    }

}


从以上代码可以看出,我们只是修改了对用户表的操作调用,密码对比,ValidatePassword($password)方法中,就是密码验证,你可以写自己的密码加密验证方式,也可以使用Yii自带的加密验证方式。(无论你使用哪种密码验证方式,当你创建用户的时候,也需要使用这种加密验证方式哦)

四、创建User::调用

为了让代码干净一点,我创建了models/Users.php,因为Users::需要使用

$user = Users::find()->where(array('accessToken' => $token))->one();

models/Users.php代码如下:

<?php

/*
 * 用户表
 */

namespace app\models;

use yii\db\ActiveRecord;
use Yii;

class Users extends \yii\db\ActiveRecord {

    /**
     * @return string 返回该AR类关联的数据表名
     */
    public static function tableName() {
        return 'user';
    }

}

备注:如果你不想创建多余的Users.php文件,你还可以使用其他方法,当然,代码稍微不同,这里就不详细讲解

1、你可以直接让User.php继承\yii\db\ActiveRecord。继承代码如下

<?php
namespace app\models;
class User extends /*\yii\base\Object*/ \yii\db\ActiveRecord implements \yii\web\IdentityInterface

2、你甚至可以使用Yii2的基础SQL查询


到这里,就完成了Yii2基础版的登录注册了

© 著作权归作者所有

卖小女孩的小火柴
粉丝 46
博文 68
码字总数 28535
作品 1
成都
项目经理
私信 提问
加载中

评论(5)

通灵诗人
yinkanglong@163.com希望能得到指点
通灵诗人
能询问一下关于yii2中用户认证机制的问题吗?
在使用yii2的认证过程中,我没有使用loginForm中要求的user表,创建了另外一张用户表(userinfro(user_id,user_name,password,authkey)),然后修改了loginForm中的函数中的变量,但是没有在登陆后调用Yii::$app->user->identity ->id时一直为空, Yii::$app->user->isGuest一直为真,不知道为什么
南国野兽
南国野兽

引用来自“南湖船老大”的评论

new static($user); 这是什么鬼,怎地好贱的写法。。。
这是延迟静态绑定,可是php5.3就有的属性。主要是为了实现依赖注入。
卖小女孩的小火柴
卖小女孩的小火柴 博主

引用来自“南湖船老大”的评论

new static($user); 这是什么鬼,怎地好贱的写法。。。

以前也没有见过,看了yii2中是这样写的,php的一个新特性吧。连接:http://php.net/manual/zh/language.oop5.late-static-bindings.php
南湖船老大
南湖船老大
new static($user); 这是什么鬼,怎地好贱的写法。。。
建立第一个 Yii 应用

为了对 Yii 有个初步认识,我们在本节讲述如何建立第一个 Yii 应用。我们将使用 (命令行工具)创建一个新的 Yii 应用。(强大的基于web的代码生成器)为特定的任务完成自动代码生成。假定 ...

红薯
2009/11/02
3.1K
4
yii2搭建完美后台并实现rbac权限控制

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

白狼栈
2016/03/30
885
2
如何在hostease部署基于yii框架技术的web网站

从中午到腾到凌晨2点多,总算把网站部署好了。本以为会很轻松的,因为写好的blog网站,一直在我自己的LAMP环境主机上运行的很顺利,结果一放到网络服务器上,就遇到了问题。官方的教程是满足...

南国野兽
2013/01/07
308
0
yii2项目实战-用户管理之登录与注册功能实现

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

白狼栈
2016/09/09
58
0
Yii2 实例管理

Yii2 实例管理 Yii2框架没有提供类似ZendFramework3中提供的ServiceManager.那么Yii2框架是如何管理对象实例的呢? 长时间使用Yii2框架的童鞋一定已经适应了对象中的public变量,以及一个来自y...

Vett
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
17
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部