Yii2如何实现用户登陆

这两天空的时候,看了下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基础版的登录注册了

转载于:https://my.oschina.net/kenblog/blog/399027

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值