ホームページ  >  記事  >  PHPフレームワーク  >  yii へのログイン方法

yii へのログイン方法

尚
オリジナル
2019-12-31 14:56:201917ブラウズ

yii へのログイン方法

yii ログイン方法の例:

1. LoginForm.php

ユーザー ログイン モジュール、送信されるのはユーザー名とパスワードであるため、ユーザーが送信したデータを特別に処理するためのモデルを最初に作成する必要があるため、まず新しい 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;
    }
}

このモデルは、基本的なログイン フォームに付属する LoginForm に基づいて変更されます。テンプレートのほとんどのコードには次のコードがあることに注意してください:

コード番号①はルール ルールです。ルール ルールは、入力されたデータのルールを定義します。入力されたデータが正しいかどうかを確認します。は空で形式に準拠しています。そのうちの 1 つは列がパスワードで、対応するルールは validatePassword です。これにより、現在のクラスの validatePassword() メソッドが自動的に呼び出されます。User クラスに対応するメソッドとの区別に注意してください。下に。コード

② は、User クラスの findByUsername メソッドを呼び出します。この User クラスは、主に現在の LoginForm データと比較するための AR クラス インスタンスを返すために以下に記述されます。コード番号

③ については、ここではここでは触れませんが、後ほど 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 &#39;user&#39;;
	}

(2) IdentityInterface インターフェイス

一般に、データベースからデータを検索するには、 AR クラスですが、私たちのものはユーザー ログイン モデルであり、コアは検証であるため、コアの Verification 関数を実装するのは自然であり、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 は現在のユーザー ログイン モデルではあまり役に立ちません。リセットフル ログインの検証に特に使用されます。詳細は Baidu で確認できます。ここでは説明しません。

③getId: 現在の AR クラスに対応する ID を返します。

④getAuthKey: 現在の AR クラスに対応する auth_key を返します。

⑤validateAuthKey: このメソッドはより重要です。後ほど説明します Cookie ログイン検証の核心に到達します。

User.php にインターフェイスを実装し、上記のメソッドを書き換えます。完全な 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 コードでは、これは次のとおりです。 quote メソッドの目的は、ユーザーが送信したユーザー名に基づいて、データ テーブル内のユーザー名と同じデータ項目、つまり AR インスタンスを返すことです。

②validatePassword(): ここでは、ユーザーが送信したパスワードが現在の AR クラスのパスワードと比較されます。

③generateAuthKey(): Cookie ログイン用のランダムな auth_key を生成します。

LoginForm と User の合計 2 つの Model クラスが作成されました。1 つはユーザーが送信したデータを受信するために使用され、もう 1 つはデータベースからデータを取得するために使用されます。

Controller (コントローラー)

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(&#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 から、現在はゲスト モード、つまりログインしていません。ユーザーがログインしている場合、現在ログインしているユーザーの情報がユーザー クラスに格納されます。

②あなたが現在訪問者の場合、最初に LoginForm モデルがインスタンス化されます。

③このコード行は、ログイン メソッド全体の中核です。最初: $model->load(Yii: :$ app->request->post()) は、投稿データを $model (LoginForm モデル) に入力します。true が返されれば、入力は成功です。次: $model->login(): LoginForm クラスの login() メソッドを実行します。login() メソッドから、一連の検証が実行されることがわかります。

View(View)

モデルとコントローラーを実装したら、次はビュー部分ですが、ユーザーがデータを入力する必要があるため、フォームを用意する必要があります。クイック フォームを生成します。コードは次のとおりです:

<?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>

推奨学習: yii フレームワーク

以上がyii へのログイン方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。