旗下导航:搜·么
当前位置:网站首页 > PHP框架 > YII > 正文

yii如何做登录【yii框架教程】,yii

作者:搜搜PHP网发布时间:2020-01-01分类:YII浏览:70


导读:yii做登录的要领示例:1、LoginForm.php用户上岸模块,所提交的是username和password,所以我们要先竖立一个Model,特地处置惩罚用户提交的...

yii做登录的要领示例:

1、LoginForm.php

用户上岸模块,所提交的是username和password,所以我们要先竖立一个Model,特地处置惩罚用户提交的数据,所以先新建一个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
            [['username', 'password'], 'required','message'=>""],
            // rememberMe must be a boolean value
            ['rememberMe', 'boolean'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
        ];
    }
 
    /**
     * 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, 'Incorrect username or password.');
            }
        }
    }
 
    /**
     * 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是依据basic模板自带的LoginForm修正而成,代码中大多有解释,这里关注以下代码:

①号代码处是rules划定规矩,rules划定规矩定义了添补过来的数据的划定规矩,考证所填的数据是不是为空,是不是相符花样之类的,其中有一栏是password,对应的划定规矩是validatePassword,会自动挪用当前类的validatePassword()要领,注重与下文的User类对应的要领辨别。

②号代码,挪用了User类内里的findByUsername要领,这个User类下面会写到,主假如为了返回一个AR类实例,与当前LoginForm的数据举行比较。

③号代码,这里临时不提,等讲到cookie上岸的时刻再提。

2、User.php

(1)ActiveRecord 类

在完成LoginForm后,我们还缺乏一些东西,从用户接受到数据了,那末还须要从数据库掏出响应的数据来举行比较,所以我们接下来须要完成的是一个从数据库猎取的数据的类——AR类,全称是ActiveRecord,运动纪录类,轻易用于查找数据,只需类名和数据表的表名雷同,那末它就能从这个数据表中猎取数据,比如说如许:

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

还能本身增加返回的表名,只需在这个类中重写以下要领:

public static function tableName(){
		return 'user';
	}

(2)IdentityInterface 接口

一般来说,从数据库查找数据,只须要继续AR类即可,然则,我们这个是用户登录模子,中心是考证,所以天然须要完成中心的考证功用,就像LoginForm模子提到的validatePassword一样,现实的考证逻辑是在当前的User模子完成的。一般来说,完成IdentityInterface接口,须要完成以下要领:

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

①findIdentity:是依据id查找数据表对应的数据

②findIdentityByAccessToken是依据AccessToken(上文提到的)查找对应的数据,而AccessToken我们在数据表也有这个字段,那末它到底有什么用呢?实在AccessToken在我们当前的用户上岸模子中用途并不大,它是特地用于Resetful上岸考证用到的,细致可自行百度,这里不睁开申明。

③getId:返回当前AR类所对应的id

④getAuthKey:返回当前AR类所对应的auth_key

⑤validateAuthKey:这个要领比较主要,是我们背面要讲到的cookie上岸考证的中心地点。

在我们的User.php完成接口,然后重写以上要领,完全的User.php的代码以下:

<?php
namespace app\modules\backend\models;
use yii\db\ActiveRecord;
 
class User extends ActiveRecord implements \yii\web\IdentityInterface
{
 
	public static function tableName(){
		return 'user';
	}
 
	public static function findIdentity($id){
		return static::findOne($id);
	}
 
	public static function findIdentityByAccessToken($token,$type=null){
		return static::findOne(['accessToken'=>$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);
	}
 
   <span style="white-space:pre">	</span> /**
    <span style="white-space:pre">	</span> * Generates "remember me" authentication key
    <span style="white-space:pre">	</span> */
        public function generateAuthKey()                    //③
        {
       <span style="white-space:pre">		</span>$this->auth_key = \Yii::$app->security->generateRandomString();
       <span style="white-space:pre">		</span>$this->save();
        }
 
}
?>

①findByUsername():在LoginForm的代码中,引用了这个要领,目标是依据用户提交的username返回一个在数据表与username雷同的数据项,即AR实例。

②validatePassword():这里对用户提交的暗码以及当前AR类的暗码举行比较。

③generateAuthKey():生成随机的auth_key,用于cookie上岸。

一共写了两个Model类:LoginForm和User,一个用于吸收用户提交的数据,一个用于猎取数据库的数据。

控制器(Controller)

控制器,主假如用于数据的提交,把用户提交的数据添补到响应的模子(Model)中,然后依据模子返回的信息进一步衬着视图(View),或许实行其他逻辑。

这里,把控制器命名为LoginController.php,以下是完全的完成代码:

<?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('index');
    }
 
    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('login', [      //⑤
            'model' => $model,
        ]);
    }
 
    public function actionLogout()
    {
        Yii::$app->user->logout();
 
        return $this->goHome();
    }
}

①起首从\Yii::$app->user->isGuest中推断,当前是不是是旅客形式,即未上岸状况,假如用户已上岸,会在user类中贮存当前上岸用户的信息。

②假如当前是旅客,会先实例化一个LoginForm模子

③这行代码是全部login要领的中心地点,起首:$model->load(Yii::$app->request->post())把post过来的数据添补进$model,即LoginForm模子,假如返回true,则添补胜利。接着:$model->login():实行LoginForm类内里的login()要领,能够从login()要领内里看到,将会实行一系列的考证。

视图(View)

在完成了model和controller,接下来是视图部份,因为用户须要输入数据,所以我们要供应一个表单,在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 = 'Login';
$this->params['breadcrumbs'][] = $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([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
            'labelOptions' => ['class' => 'col-lg-1 control-label'],
        ],
    ]); ?>
        <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
        <?= $form->field($model, 'password')->passwordInput() ?>
        <?= $form->field($model, 'rememberMe')->checkbox([
            'template' => "<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('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
            </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>

引荐进修:yii框架

以上就是yii如何做登录的细致内容,更多请关注ki4网别的相干文章!

标签:yii