亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) php框架 YII yii怎麼做登入

yii怎麼做登入

Dec 31, 2019 pm 02:56 PM
yii

yii怎麼做登入

yii做登入的方法範(fàn)例:

1、LoginForm.php

使用者登陸模組,所提交的是username和password,所以我們要先建立一個(gè)Model,專(zhuān)門(mén)處理用戶(hù)提交的數(shù)據(jù),所以先新建一個(gè)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修改而成,程式碼中大多有註釋?zhuān)@裡關(guān)注以下程式碼:

①號(hào)程式碼處是rules規(guī)則,rules規(guī)則定義了填滿(mǎn)過(guò)來(lái)的資料的規(guī)則,驗(yàn)證所填的資料是否為空,是否符合格式之類(lèi)的,其中有一欄位是password,對(duì)應(yīng)的規(guī)則是validatePassword,會(huì)自動(dòng)呼叫目前類(lèi)別的validatePassword()方法,注意與下文的User類(lèi)別對(duì)應(yīng)的方法區(qū)分。

②號(hào)程式碼,呼叫了User類(lèi)別裡面的findByUsername方法,這個(gè)User類(lèi)別下面會(huì)寫(xiě)到,主要是為了傳回一個(gè)AR類(lèi)別實(shí)例,與目前LoginForm的資料進(jìn)行比較。

③號(hào)代碼,這裡暫時(shí)不提,等講到cookie登陸的時(shí)候再提。

2、User.php

(1)ActiveRecord 類(lèi)別

#在完成LoginForm後,我們還缺少一些東西,從使用者接受到資料了,那麼還需要從資料庫(kù)取出相應(yīng)的數(shù)據(jù)來(lái)進(jìn)行比較,所以我們接下來(lái)需要完成的是一個(gè)從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù)的類(lèi)——AR類(lèi),全稱(chēng)是ActiveRecord,活動(dòng)記錄類(lèi),方便用於查找數(shù)據(jù),只要類(lèi)名和數(shù)據(jù)表的表名相同,那麼它就能從這個(gè)數(shù)據(jù)表中獲取數(shù)據(jù),比如說(shuō)這樣:

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

還能自己添加返回的表名,只要在這個(gè)類(lèi)別中重寫(xiě)以下方法:

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

(2)IdentityInterface 介面

一般來(lái)說(shuō),從資料庫(kù)中找到數(shù)據(jù),只需要繼承AR類(lèi)別即可,但是,我們這個(gè)是使用者登入模型,核心是驗(yàn)證,所以自然需要實(shí)現(xiàn)核心的驗(yàn)證功能,就像LoginForm模型提到的validatePassword一樣,實(shí)際的驗(yàn)證邏輯是在目前的User模型完成的。一般來(lái)說(shuō),實(shí)作IdentityInterface接口,需要實(shí)作以下方法:

    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查找資料表對(duì)應(yīng)的資料

②findIdentityByAccessToken是根據(jù)AccessToken(上文提到的)來(lái)尋找對(duì)應(yīng)的數(shù)據(jù),而AccessToken我們?cè)跀?shù)據(jù)表也有這個(gè)字段,那麼它到底有什麼用呢?其實(shí)AccessToken在我們目前的用戶(hù)登陸模型中用處並不大,它是專(zhuān)門(mén)用於Resetful登陸驗(yàn)證用到的,具體可自行百度,這裡不展開(kāi)說(shuō)明。

③getId:傳回目前AR類(lèi)別所對(duì)應(yīng)的id

④getAuthKey:傳回目前AR類(lèi)別所對(duì)應(yīng)的auth_key

⑤validateAuthKey:這個(gè)方法比較重要,是我們後面要講到的cookie登陸驗(yàn)證的核心所在。

在我們的User.php實(shí)作接口,然後重寫(xiě)以上方法,完整的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的程式碼中,引用了這個(gè)方法,目的是根據(jù)使用者提交的username傳回一個(gè)在資料表與username相同的資料項(xiàng),即AR實(shí)例。

②validatePassword():這裡將使用者提交的密碼以及目前AR類(lèi)別的密碼進(jìn)行比較。

③generateAuthKey():產(chǎn)生隨機(jī)的auth_key,用於cookie登陸。

總共寫(xiě)了兩個(gè)Model類(lèi)別:LoginForm和User,一個(gè)用來(lái)接收使用者提交的數(shù)據(jù),一個(gè)用來(lái)取得資料庫(kù)的資料。

控制器(Controller)

控制器,主要用於資料的提交,把使用者提交的資料填入對(duì)應(yīng)的模型(Model)中,然後根據(jù)模型傳回的資訊進(jìn)一步渲染視圖(View),或執(zhí)行其他邏輯。

這裡,把控制器命名為L(zhǎng)oginController.php,以下是完整的實(shí)作程式碼:

<?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中判斷,目前是否為遊客模式,即未登陸狀態(tài),如果使用者已經(jīng)登陸,會(huì)在user類(lèi)別中儲(chǔ)存目前登陸使用者的資訊。

②如果目前是遊客,會(huì)先實(shí)例化一個(gè)LoginForm模型

③這行程式碼是整個(gè)login方法的核心所在,首先:$model->load(Yii::$ app->request->post())把post過(guò)來(lái)的資料填入$model,即LoginForm模型,如果回傳true,則填入成功。接著:$model->login():執(zhí)行LoginForm類(lèi)別裡面的login()方法,可以從login()方法裡面看到,將會(huì)執(zhí)行一系列的驗(yàn)證。

視圖(View)

在實(shí)作了model和controller,接下來(lái)是視圖部分,由於使用者需要輸入數(shù)據(jù),所以我們要提供一個(gè)表單,在Yii2中,提供了ActiveForm快速產(chǎn)生表單,程式碼如下:

<?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)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1597
29
PHP教程
1488
72
Yii2 vs Phalcon:哪個(gè)框架更適合開(kāi)發(fā)顯示卡渲染應(yīng)用? Yii2 vs Phalcon:哪個(gè)框架更適合開(kāi)發(fā)顯示卡渲染應(yīng)用? Jun 19, 2023 am 08:09 AM

在當(dāng)前資訊時(shí)代,大數(shù)據(jù)、人工智慧、雲(yún)端運(yùn)算等技術(shù)已成為了各大企業(yè)關(guān)注的熱點(diǎn)。在這些技術(shù)中,顯示卡渲染技術(shù)作為一種高效能圖形處理技術(shù),受到了越來(lái)越多的關(guān)注。顯示卡渲染技術(shù)廣泛應(yīng)用於遊戲開(kāi)發(fā)、影視特效、工程建模等領(lǐng)域。而對(duì)於開(kāi)發(fā)者來(lái)說(shuō),選擇一個(gè)適合自己專(zhuān)案的框架,是一個(gè)非常重要的決策。在目前的語(yǔ)言中,PHP是一種相當(dāng)有活力的語(yǔ)言,一些優(yōu)秀的PHP框架如Yii2、Ph

Yii框架中的資料查詢(xún):有效率地存取數(shù)據(jù) Yii框架中的資料查詢(xún):有效率地存取數(shù)據(jù) Jun 21, 2023 am 11:22 AM

Yii框架是一個(gè)開(kāi)源的PHPWeb應(yīng)用程式框架,提供了眾多的工具和元件,簡(jiǎn)化了Web應(yīng)用程式開(kāi)發(fā)的流程,其中資料查詢(xún)是其中一個(gè)重要的元件之一。在Yii框架中,我們可以使用類(lèi)似SQL的語(yǔ)法來(lái)存取資料庫(kù),從而有效率地查詢(xún)和操作資料。 Yii框架的查詢(xún)建構(gòu)器主要包括以下幾種類(lèi)型:ActiveRecord查詢(xún)、QueryBuilder查詢(xún)、命令查詢(xún)和原始SQL查詢(xún)

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

隨著Web應(yīng)用需求的不斷增長(zhǎng),開(kāi)發(fā)者在選擇開(kāi)發(fā)框架方面也越來(lái)越有選擇的空間。 Symfony和Yii2是兩個(gè)備受歡迎的PHP框架,它們都具有強(qiáng)大的功能和效能,但在面對(duì)需要開(kāi)發(fā)大型網(wǎng)路應(yīng)用程式時(shí),哪個(gè)框架更適合呢?接下來(lái)我們將對(duì)Symphony和Yii2進(jìn)行比較分析,以幫助你更好地進(jìn)行選擇?;靖攀鯯ymphony是一個(gè)由PHP編寫(xiě)的開(kāi)源Web應(yīng)用框架,它是建立

php如何使用Yii3框架? php如何使用Yii3框架? May 31, 2023 pm 10:42 PM

隨著互聯(lián)網(wǎng)的不斷發(fā)展,Web應(yīng)用程式開(kāi)發(fā)的需求也越來(lái)越高。對(duì)於開(kāi)發(fā)人員而言,開(kāi)發(fā)應(yīng)用程式需要一個(gè)穩(wěn)定、高效、強(qiáng)大的框架,這樣可以提高開(kāi)發(fā)效率。 Yii是一款領(lǐng)先的高效能PHP框架,它提供了豐富的特性和良好的性能。 Yii3是Yii框架的下一代版本,它在Yii2的基礎(chǔ)上進(jìn)一步優(yōu)化了效能和程式碼品質(zhì)。在這篇文章中,我們將介紹如何使用Yii3框架來(lái)開(kāi)發(fā)PHP應(yīng)用程式。

如何使用PHP框架Yii開(kāi)發(fā)一個(gè)高可用的雲(yún)端備份系統(tǒng) 如何使用PHP框架Yii開(kāi)發(fā)一個(gè)高可用的雲(yún)端備份系統(tǒng) Jun 27, 2023 am 09:04 AM

隨著雲(yún)端運(yùn)算技術(shù)的不斷發(fā)展,資料的備份已經(jīng)成為了每個(gè)企業(yè)必須要做的事情。在這樣的背景下,開(kāi)發(fā)一款高可用的雲(yún)端備份系統(tǒng)尤其重要。而PHP框架Yii是一款功能強(qiáng)大的框架,可以幫助開(kāi)發(fā)者快速建立高效能的Web應(yīng)用程式。以下將介紹如何使用Yii框架開(kāi)發(fā)一款高可用的雲(yún)端備份系統(tǒng)。設(shè)計(jì)資料庫(kù)模型在Yii框架中,資料庫(kù)模型是非常重要的一環(huán)。因?yàn)橘Y料備份系統(tǒng)需要用到很多的表和關(guān)

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

Laravel和Yii的主要區(qū)別在於設(shè)計(jì)理念、功能特性和使用場(chǎng)景。 1.Laravel注重開(kāi)發(fā)的簡(jiǎn)潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開(kāi)發(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)建過(guò)程;2.使用DockerCompose啟動(dòng)Yii應(yīng)用和MySQL數(shù)據(jù)庫(kù);3.優(yōu)化鏡像大小和性能。這不僅涉及到具體的技術(shù)操作,還包括理解Dockerfile的工作原理和最佳實(shí)踐,以確保高效、可靠的部署。

Yii2 vs Symfony:哪個(gè)框架比較適合API開(kāi)發(fā)? Yii2 vs Symfony:哪個(gè)框架比較適合API開(kāi)發(fā)? Jun 18, 2023 pm 11:00 PM

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

See all articles