手记

Yii 2.0 框架初学之实现登录和注销功能

继上篇实现注册功能之后,今天分享一下Yii2.0实现登录和注销功能

  • 需要先配置好数据库,并且数据库里有相应的用户注册信息

  • 在controller/siteController.php 控制器里定义并设置登录方法
/**
* @return string\yii\web\Response
* 显示登录页面
*/
public function actionLogin()
{
    if(!Yii::$app->user->isGuest)//如果是已注册则跳转到首页
    {

        return $this->goHome();
    }
    $model=new LoginForm();//实例化登录表单模型类

    if($model->load(Yii::$app->request->post()) && $model->login())
    {
        return $this->goHome();//如果登录成功则转到首页
    }else {

        return $this->render('login',['model'=>$model]);//登录不成功则显示登录界面,显示登录界面需要输出视图文件(见下面),并将配置模型
    }
}

    * 在models/LoginForm 模型类里写下以下代码和方法

namespace home\models;//home是我自己建的根目录文件夹

use Yii;
use yii\base\Model;

class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe;

/**
 * @inheritdoc
 * 设置表单字段的验证规则  
*/
    public function rules()
    {
        return [
            [['username', 'password'], 'required'],//设置字段不能为空
            ['rememberMe','boolean'],
        ];
    }

/**
* @inheritdoc
* 设置字段的标签命名
*/
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'username' => '用户名',
            'password'=>'密码',
            'rememberMe'=>'记住我',
        ];
     }

/**
* @return bool
* 设置登录方法
*/
    public function login()
    {
        $user=User::findOne(['username'=>$this->username]);//判断用户名是否正确
        if(is_null($user))
        {
            Yii::$app->session->setFlash('错误提示','用户名输入有误');
//            echo $this->addError('username','用户名输入有误');
            return false;
        }
        else {
            if(Yii::$app->security->validatePassword($this->password, $user->password_hash))//判断密码是否正确
            {
                Yii::$app->user->login($user);//登录用户
                return true;
            }else
                {
                Yii::$app->session->setFlash('错误提示','密码输入有误');
//                echo $this->addError('password','密码输入有误');
                return false;
                }
             }
    }
}
  • 在models/LoginForm 模型类里写下以下代码和方法
namespace home\models;//home是我自己建的根目录文件夹

use Yii;
use yii\base\Model;

class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe;

/**
 * @inheritdoc
 * 设置表单字段的验证规则  
*/
    public function rules()
    {
        return [
            [['username', 'password'], 'required'],//设置字段不能为空
            ['rememberMe','boolean'],
        ];
    }

/**
* @inheritdoc
* 设置字段的标签命名
*/
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'username' => '用户名',
            'password'=>'密码',
            'rememberMe'=>'记住我',
        ];
     }

/**
* @return bool
* 设置登录方法
*/
    public function login()
    {
        $user=User::findOne(['username'=>$this->username]);//判断用户名是否正确
        if(is_null($user))
        {
            Yii::$app->session->setFlash('错误提示','用户名输入有误');
            return false;
        }
        else {
            if(Yii::$app->security->validatePassword($this->password, $user->password_hash))//判断密码是否正确
            {
                Yii::$app->user->login($user);//登录用户
                return true;
            }else
                {
                Yii::$app->session->setFlash('错误提示','密码输入有误');
                return false;
                }
             }
    }
}
  • 在对于LoginForm模型类的设置里,需要用User 模型类对针对用户的数据库操作进行设置
User模型类可用Gii进行生成

namespace home\models;

use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface
{
    public static function findIdentity($id)
    {
        return static::findOne($id);// 找到用户登录id
    }

    public static function findIdentityByAccessToken($token, $type = null)
    {
        // TODO: Implement findIdentityByAccessToken() method.
    }

    public function getId()
    {
    return $this->id;  // 返回用户id
    }

    public function getAuthKey()
    {
        // TODO: Implement getAuthKey() method.
    }

    public function validateAuthKey($authKey)
    {
        // TODO: Implement validateAuthKey() method.
    }
}

-在view/site/文件夹下新建登录界面的视图文件login.php

<?php
use yii\widgets\ActiveForm;
use yii\bootstrap\Html;
?>
<div>
    <?php $form=ActiveForm::begin();//表单开始    ?>
    <?= $form->field($model,'username')->textInput(['autoFocus'=>'true','placeholder'=>'请输入账号']); ?>
    <?= $form->field($model,'password')->passwordInput(['placeholder'=>'请输入密码'])->label('请输入密码啦');?>
    <?= $form->field($model,'rememberMe')->checkbox(['label'=>'记住我']);?>
    <div class="form-group">
        <?= Html::submitButton('登录',['class'=>'btn btn primary','name'=>'login-button']);?>
    </div>
    <?php ActiveForm::end();?>
</div>
  • 实现注销功能,在siteController里设置注销方法
/**
* @return \yii\web\Response
* 注销方法
*/

public function actionLogout()
{
    Yii::$app->user->logout();//使用应用程序下面的logout()方法即可实现
    return $this->goBack();
}
  • 以上。本文涉及到的知识点有:
    1、Yii框架里的Yii::$app->user->isGuest 可对用户是否是游客进行判断。
    Yii::$app->user->login($user); //登录用户
    Yii::$app->user->logout(); //注销用户
    2、Yii::$app->session->setFlash('错误提示','用户名输入有误'); // 实现错误提示
    3、表单组件ActiveForm的使用
8人推荐
随时随地看视频
慕课网APP

热门评论

请问登录以后的权限怎么设置?

查看全部评论