国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php框架 YII yii怎樣做登錄

yii怎樣做登錄

Dec 31, 2019 pm 02:56 PM
yii

yii怎樣做登錄

yii做登錄的方法示例:

1、LoginForm.php

用戶登陸模塊,所提交的是username和password,所以我們要先建立一個Model,專門處理用戶提交的數(shù)據(jù),所以先新建一個LoginForm.php,以下為代碼:

<?php
 
namespace app\modules\backend\models;
 
use Yii;
use yii\base\Model;
 
/**
 * LoginForm is the model behind the login form.
 */
class LoginForm extends Model
{
    public $username;
    public $password;
    public $rememberMe = true;
 
    private $_user = false;
 
 
    /**
     * @return array the validation rules.
     */
    public function rules()<span style="white-space:pre">		</span>//①
    {
        return [
            // username and password are both required
            [[&#39;username&#39;, &#39;password&#39;], &#39;required&#39;,&#39;message&#39;=>""],
            // rememberMe must be a boolean value
            [&#39;rememberMe&#39;, &#39;boolean&#39;],
            // password is validated by validatePassword()
            [&#39;password&#39;, &#39;validatePassword&#39;],
        ];
    }
 
    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
 
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, &#39;Incorrect username or password.&#39;);
            }
        }
    }
 
    /**
     * Logs in a user using the provided username and password.
     * @return boolean whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            if($this->rememberMe)
            {
                $this->_user->generateAuthKey();//③
            }
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
        }
        return false;
    }
 
    /**
     * Finds user by [[username]]
     *
     * @return User|null
     */
    public function getUser()
    {
        if ($this->_user === false) {
            $this->_user = User::findByUsername($this->username); //②
        }
 
        return $this->_user;
    }
}

該Model是根據(jù)basic模板自帶的LoginForm修改而成,代碼中大多有注釋,這里關(guān)注以下代碼:

①號代碼處是rules規(guī)則,rules規(guī)則定義了填充過來的數(shù)據(jù)的規(guī)則,驗證所填的數(shù)據(jù)是否為空,是否符合格式之類的,其中有一欄是password,對應(yīng)的規(guī)則是validatePassword,會自動調(diào)用當(dāng)前類的validatePassword()方法,注意與下文的User類對應(yīng)的方法區(qū)分。

②號代碼,調(diào)用了User類里面的findByUsername方法,這個User類下面會寫到,主要是為了返回一個AR類實例,與當(dāng)前LoginForm的數(shù)據(jù)進(jìn)行比較。

③號代碼,這里暫時不提,等講到cookie登陸的時候再提。

2、User.php

(1)ActiveRecord 類

在完成LoginForm后,我們還缺少一些東西,從用戶接受到數(shù)據(jù)了,那么還需要從數(shù)據(jù)庫取出相應(yīng)的數(shù)據(jù)來進(jìn)行比較,所以我們接下來需要完成的是一個從數(shù)據(jù)庫獲取的數(shù)據(jù)的類——AR類,全稱是ActiveRecord,活動記錄類,方便用于查找數(shù)據(jù),只要類名和數(shù)據(jù)表的表名相同,那么它就能從這個數(shù)據(jù)表中獲取數(shù)據(jù),比如說這樣:

<?php
namespace app\modules\backend\models;
use yii\db\ActiveRecord;
 
class User extends ActiveRecord{       } ?>

還能自己添加返回的表名,只要在這個類中重寫以下方法:

public static function tableName(){
		return &#39;user&#39;;
	}

(2)IdentityInterface 接口

一般來說,從數(shù)據(jù)庫查找數(shù)據(jù),只需要繼承AR類即可,但是,我們這個是用戶登錄模型,核心是驗證,所以自然需要實現(xiàn)核心的驗證功能,就像LoginForm模型提到的validatePassword一樣,實際的驗證邏輯是在當(dāng)前的User模型完成的。一般來說,實現(xiàn)IdentityInterface接口,需要實現(xiàn)以下方法:

    public static function findIdentity($id);  //①
 
    public static function findIdentityByAccessToken($token, $type = null);   //②
 
    public function getId();    //③
 
    public function getAuthKey();   //④
 
    public function validateAuthKey($authKey);    //⑤

①findIdentity:是根據(jù)id查找數(shù)據(jù)表對應(yīng)的數(shù)據(jù)

②findIdentityByAccessToken是根據(jù)AccessToken(上文提到的)查找對應(yīng)的數(shù)據(jù),而AccessToken我們在數(shù)據(jù)表也有這個字段,那么它到底有什么用呢?其實AccessToken在我們當(dāng)前的用戶登陸模型中用處并不大,它是專門用于Resetful登陸驗證用到的,具體可自行百度,這里不展開說明。

③getId:返回當(dāng)前AR類所對應(yīng)的id

④getAuthKey:返回當(dāng)前AR類所對應(yīng)的auth_key

⑤validateAuthKey:這個方法比較重要,是我們后面要講到的cookie登陸驗證的核心所在。

在我們的User.php實現(xiàn)接口,然后重寫以上方法,完整的User.php的代碼如下:

$token]);
	}
 
	public static function findByUsername($username){     //①
		return static::findOne(['username'=>$username]); 
	}
 
	public function getId(){
		return $this->id;
	}
 
	public function getAuthkey(){
		return $this->auth_key;
	}
 
	public function validateAuthKey($authKey){
		return $this->auth_key === $authKey;
	}
 
	public function validatePassword($password){          //②
		return $this->password === md5($password);
	}
 
   	 /**
    	 * Generates "remember me" authentication key
    	 */
        public function generateAuthKey()                    //③
        {
       		$this->auth_key = \Yii::$app->security->generateRandomString();
       		$this->save();
        }
 
}
?>

①findByUsername():在LoginForm的代碼中,引用了這個方法,目的是根據(jù)用戶提交的username返回一個在數(shù)據(jù)表與username相同的數(shù)據(jù)項,即AR實例。

②validatePassword():這里對用戶提交的密碼以及當(dāng)前AR類的密碼進(jìn)行比較。

③generateAuthKey():生成隨機(jī)的auth_key,用于cookie登陸。

一共寫了兩個Model類:LoginForm和User,一個用于接收用戶提交的數(shù)據(jù),一個用于獲取數(shù)據(jù)庫的數(shù)據(jù)。

控制器(Controller)

控制器,主要是用于數(shù)據(jù)的提交,把用戶提交的數(shù)據(jù)填充到相應(yīng)的模型(Model)中,然后根據(jù)模型返回的信息進(jìn)一步渲染視圖(View),或者執(zhí)行其他邏輯。

這里,把控制器命名為LoginController.php,以下是完整的實現(xiàn)代碼:

<?php
 
namespace app\controllers;
 
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
 
class SiteController extends Controller
{
    public function actionIndex()
    {
        return $this->render(&#39;index&#39;);
    }
 
    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->goBack();          //④
        }
        return $this->render(&#39;login&#39;, [      //⑤
            &#39;model&#39; => $model,
        ]);
    }
 
    public function actionLogout()
    {
        Yii::$app->user->logout();
 
        return $this->goHome();
    }
}

①首先從\Yii::$app->user->isGuest中判斷,當(dāng)前是否是游客模式,即未登陸狀態(tài),如果用戶已經(jīng)登陸,會在user類中儲存當(dāng)前登陸用戶的信息。

②如果當(dāng)前是游客,會先實例化一個LoginForm模型

③這行代碼是整個login方法的核心所在,首先:$model->load(Yii::$app->request->post())把post過來的數(shù)據(jù)填充進(jìn)$model,即LoginForm模型,如果返回true,則填充成功。接著:$model->login():執(zhí)行LoginForm類里面的login()方法,可以從login()方法里面看到,將會執(zhí)行一系列的驗證。

視圖(View)

在實現(xiàn)了model和controller,接下來是視圖部分,由于用戶需要輸入數(shù)據(jù),所以我們要提供一個表單,在Yii2中,提供了ActiveForm快速生成表單,代碼如下:

<?php
 
/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model app\models\LoginForm */
 
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
 
$this->title = &#39;Login&#39;;
$this->params[&#39;breadcrumbs&#39;][] = $this->title;
?>
<div class="site-login">
    <h1><?= Html::encode($this->title) ?></h1>
    <p>Please fill out the following fields to login:</p>
    <?php $form = ActiveForm::begin([
        &#39;id&#39; => &#39;login-form&#39;,
        &#39;options&#39; => [&#39;class&#39; => &#39;form-horizontal&#39;],
        &#39;fieldConfig&#39; => [
            &#39;template&#39; => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            &#39;labelOptions&#39; => [&#39;class&#39; => &#39;col-lg-1 control-label&#39;],
        ],
    ]); ?>
        <?= $form->field($model, &#39;username&#39;)->textInput([&#39;autofocus&#39; => true]) ?>
        <?= $form->field($model, &#39;password&#39;)->passwordInput() ?>
        <?= $form->field($model, &#39;rememberMe&#39;)->checkbox([
            &#39;template&#39; => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
        ]) ?>
        <div class="form-group">
            <div class="col-lg-offset-1 col-lg-11">
                <?= Html::submitButton(&#39;Login&#39;, [&#39;class&#39; => &#39;btn btn-primary&#39;, &#39;name&#39; => &#39;login-button&#39;]) ?>
            </div>
        </div>
    <?php ActiveForm::end(); ?>
    <div class="col-lg-offset-1" style="color:#999;">
        You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
        To modify the username/password, please check out the code <code>app\models\User::$users</code>.
    </div>
</div>

推薦學(xué)習(xí):yii框架

以上是yii怎樣做登錄的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
Yii2 vs Phalcon:哪個框架更適合開發(fā)顯卡渲染應(yīng)用? Yii2 vs Phalcon:哪個框架更適合開發(fā)顯卡渲染應(yīng)用? Jun 19, 2023 am 08:09 AM

在當(dāng)前信息時代,大數(shù)據(jù)、人工智能、云計算等技術(shù)已經(jīng)成為了各大企業(yè)關(guān)注的熱點(diǎn)。在這些技術(shù)中,顯卡渲染技術(shù)作為一種高性能圖形處理技術(shù),受到了越來越多的關(guān)注。顯卡渲染技術(shù)被廣泛應(yīng)用于游戲開發(fā)、影視特效、工程建模等領(lǐng)域。而對于開發(fā)者來說,選擇一個適合自己項目的框架,是一個非常重要的決策。在當(dāng)前的語言中,PHP是一種頗具活力的語言,一些優(yōu)秀的PHP框架如Yii2、Ph

Yii框架中的數(shù)據(jù)查詢:高效地訪問數(shù)據(jù) Yii框架中的數(shù)據(jù)查詢:高效地訪問數(shù)據(jù) Jun 21, 2023 am 11:22 AM

Yii框架是一個開源的PHPWeb應(yīng)用程序框架,提供了眾多的工具和組件,簡化了Web應(yīng)用程序開發(fā)的流程,其中數(shù)據(jù)查詢是其中一個重要的組件之一。在Yii框架中,我們可以使用類似SQL的語法來訪問數(shù)據(jù)庫,從而高效地查詢和操作數(shù)據(jù)。Yii框架的查詢構(gòu)建器主要包括以下幾種類型:ActiveRecord查詢、QueryBuilder查詢、命令查詢和原始SQL查詢

Symfony vs Yii2:哪個框架更適合開發(fā)大型Web應(yīng)用? Symfony vs Yii2:哪個框架更適合開發(fā)大型Web應(yīng)用? Jun 19, 2023 am 10:57 AM

隨著Web應(yīng)用需求的不斷增長,開發(fā)者們在選擇開發(fā)框架方面也越來越有選擇的余地。Symfony和Yii2是兩個備受歡迎的PHP框架,它們都具有強(qiáng)大的功能和性能,但在面對需要開發(fā)大型Web應(yīng)用時,哪個框架更適合呢?接下來我們將對Symphony和Yii2進(jìn)行比較分析,以幫助你更好地進(jìn)行選擇。基本概述Symphony是一個由PHP編寫的開源Web應(yīng)用框架,它是建立

如何使用PHP框架Yii開發(fā)一個高可用的云備份系統(tǒng) 如何使用PHP框架Yii開發(fā)一個高可用的云備份系統(tǒng) Jun 27, 2023 am 09:04 AM

隨著云計算技術(shù)的不斷發(fā)展,數(shù)據(jù)的備份已經(jīng)成為了每個企業(yè)必須要做的事情。在這樣的背景下,開發(fā)一款高可用的云備份系統(tǒng)尤為重要。而PHP框架Yii是一款功能強(qiáng)大的框架,可以幫助開發(fā)者快速構(gòu)建高性能的Web應(yīng)用程序。下面將介紹如何使用Yii框架開發(fā)一款高可用的云備份系統(tǒng)。設(shè)計數(shù)據(jù)庫模型在Yii框架中,數(shù)據(jù)庫模型是非常重要的一部分。因為數(shù)據(jù)備份系統(tǒng)需要用到很多的表和關(guān)

php框架laravel和yii區(qū)別是什么 php框架laravel和yii區(qū)別是什么 Apr 30, 2025 pm 02:24 PM

Laravel和Yii的主要區(qū)別在于設(shè)計理念、功能特性和使用場景。1.Laravel注重開發(fā)的簡潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開發(fā)和初學(xué)者。2.Yii強(qiáng)調(diào)性能和效率,適用于高負(fù)載應(yīng)用,提供高效的ActiveRecord和緩存系統(tǒng),但學(xué)習(xí)曲線較陡。

yii與Docker:容器化和部署您的應(yīng)用程序 yii與Docker:容器化和部署您的應(yīng)用程序 Apr 02, 2025 pm 02:13 PM

使用Docker容器化和部署Yii應(yīng)用的步驟包括:1.創(chuàng)建Dockerfile,定義鏡像構(gòu)建過程;2.使用DockerCompose啟動Yii應(yīng)用和MySQL數(shù)據(jù)庫;3.優(yōu)化鏡像大小和性能。這不僅涉及到具體的技術(shù)操作,還包括理解Dockerfile的工作原理和最佳實踐,以確保高效、可靠的部署。

Yii2 vs Symfony:哪個框架更適合API開發(fā)? Yii2 vs Symfony:哪個框架更適合API開發(fā)? Jun 18, 2023 pm 11:00 PM

隨著互聯(lián)網(wǎng)的快速發(fā)展,API成為了各種應(yīng)用間數(shù)據(jù)交換的重要方式。因此,開發(fā)一款易于維護(hù)、高效、穩(wěn)定的API框架變得越來越重要。而在選擇API框架時,Yii2和Symfony是兩個備受開發(fā)者歡迎的選擇。那么,哪一個更適合API開發(fā)呢?本文將對這兩個框架進(jìn)行比較,并給出一些結(jié)論。一、基本介紹Yii2和Symfony都是成熟的PHP框架,都有相應(yīng)的擴(kuò)展,可以用于開

Yii2編程指南:運(yùn)行Cron服務(wù)的方法 Yii2編程指南:運(yùn)行Cron服務(wù)的方法 Sep 01, 2023 pm 11:21 PM

如果您問“Yii是什么?”查看我之前的教程:Yii框架簡介,其中回顧了Yii的優(yōu)點(diǎn),并概述了2014年10月發(fā)布的Yii2.0的新增功能。嗯>在這個使用Yii2編程系列中,我將指導(dǎo)讀者使用Yii2PHP框架。在今天的教程中,我將與您分享如何利用Yii的控制臺功能來運(yùn)行cron作業(yè)。過去,我在cron作業(yè)中使用了wget—可通過Web訪問的URL來運(yùn)行我的后臺任務(wù)。這引發(fā)了安全問題并存在一些性能問題。雖然我在我們的啟動系列安全性專題中討論了一些減輕風(fēng)險的方法,但我曾希望過渡到控制臺驅(qū)動的命令

See all articles