Heim  >  Artikel  >  PHP-Framework  >  So melden Sie sich bei yii an

So melden Sie sich bei yii an

尚
Original
2019-12-31 14:56:201966Durchsuche

So melden Sie sich bei yii an

Beispiel für die yii-Anmeldemethode:

1. LoginForm.php

Benutzeranmeldemodul, es werden Benutzername und Passwort übermittelt, also wir Sie Sie müssen zuerst ein Modell erstellen, um die von Benutzern übermittelten Daten speziell zu verarbeiten. Erstellen Sie daher zunächst ein neues LoginForm.php. Das Folgende ist der Code:

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

Dieses Modell wird basierend auf dem LoginForm geändert, das mit der Basisversion geliefert wird Der größte Teil des Codes ist vorhanden. Beachten Sie hier den folgenden Code:

Die Codenummer ① ist die Regel. Die Regeln definieren die Regeln für die ausgefüllten Daten. Überprüfen Sie, ob die ausgefüllten Daten vorhanden sind ist leer, ob es dem Format entspricht usw., unter denen es eine gibt Die Spalte ist „Passwort“ und die entsprechende Regel ist „validatePassword“, die automatisch die Methode „validatePassword()“ der aktuellen Klasse aufruft. Achten Sie darauf, sie zu unterscheiden die Methode, die der Benutzerklasse unten entspricht.

Codenummer ② ruft die findByUsername-Methode in der User-Klasse auf. Diese User-Klasse wird unten geschrieben, hauptsächlich um eine AR-Klasseninstanz zum Vergleich mit den aktuellen LoginForm-Daten zurückzugeben.

Die Codenummer ③ wird hier vorerst nicht erwähnt. Wir werden sie erwähnen, wenn wir über die Cookie-Anmeldung sprechen.

2. User.php

(1) ActiveRecord-Klasse

Nach dem Ausfüllen von LoginForm fehlt uns noch etwas, das wir noch erhalten müssen Die Datenbank entnimmt die entsprechenden Daten zum Vergleich. Als Nächstes müssen wir eine Klasse für die aus der Datenbank erhaltenen Daten vervollständigen. Der vollständige Name lautet ActiveRecord Daten finden. Solange der Klassenname und die Datentabelle identisch sind, können Daten aus dieser Datentabelle abgerufen werden, zum Beispiel:

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

Sie können auch den zurückgegebenen Tabellennamen hinzufügen Überschreiben Sie einfach die folgende Methode in dieser Klasse:

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

(2) IdentityInterface-Schnittstelle

Um Daten aus der Datenbank zu finden, müssen Sie im Allgemeinen nur die AR-Klasse erben. Bei uns handelt es sich um ein Benutzeranmeldemodell, dessen Kern die Verifizierung ist. Daher ist es selbstverständlich, die Kernverifizierungsfunktion zu implementieren, genau wie „validatePassword“ im LoginForm-Modell erwähnt, und die eigentliche Verifizierungslogik wird im aktuellen Benutzermodell vervollständigt. Im Allgemeinen müssen Sie zum Implementieren der IdentityInterface-Schnittstelle die folgenden Methoden implementieren:

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

①findIdentity: Suchen Sie die Daten, die der Datentabelle entsprechen, basierend auf der ID

②findIdentityByAccessToken dient zum Suchen der entsprechenden Daten Daten basieren auf AccessToken-Daten (oben erwähnt) und AccessToken. Wir haben dieses Feld auch in der Datentabelle. Wofür wird es also verwendet? Tatsächlich ist AccessToken in unserem aktuellen Benutzeranmeldemodell nicht sehr nützlich. Es wird speziell für die Resetful-Anmeldeüberprüfung verwendet. Die Details finden Sie hier.

③getId: Gibt die ID zurück, die der aktuellen AR-Klasse entspricht

④getAuthKey: Gibt den auth_key zurück, der der aktuellen AR-Klasse entspricht

⑤validateAuthKey: Diese Methode ist wichtiger und wir werden es tun Sprechen Sie später darüber. Der Kern der Cookie-Anmeldeüberprüfung ist erreicht.

Implementieren Sie die Schnittstelle in unserer User.php und schreiben Sie dann die obige Methode neu. Der vollständige User.php-Code lautet wie folgt:

$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(): Im LoginForm-Code ist dies Der Zweck der Methode besteht darin, ein Datenelement zurückzugeben, das mit dem Benutzernamen in der Datentabelle übereinstimmt, dh eine AR-Instanz, basierend auf dem vom Benutzer übermittelten Benutzernamen.

②validatePassword(): Hier wird das vom Benutzer übermittelte Passwort mit dem Passwort der aktuellen AR-Klasse verglichen.

③generateAuthKey(): Generiert einen zufälligen Auth_Key für die Cookie-Anmeldung.

Es wurden insgesamt zwei Modellklassen geschrieben: LoginForm und User. Eine dient zum Empfangen von von Benutzern übermittelten Daten und die andere zum Abrufen von Daten aus der Datenbank.

Controller

Controller, der hauptsächlich für die Datenübermittlung verwendet wird, füllt die vom Benutzer übermittelten Daten in das entsprechende Modell (Modell) und rendert dann die Ansicht weiter (Ansicht). ) basierend auf den vom Modell zurückgegebenen Informationen oder führen Sie eine andere Logik aus.

Nennen Sie hier den Controller LoginController.php. Das Folgende ist der vollständige Implementierungscode:

<?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();
    }
}

① Erster Richter von Yii::$app->user->isGuest, Ob der Der aktuelle Benutzermodus ist der Gastmodus, dh er ist nicht angemeldet. Wenn der Benutzer angemeldet ist, werden die Informationen des aktuell angemeldeten Benutzers in der Benutzerklasse gespeichert.

② Wenn Sie derzeit Besucher sind, wird zuerst ein LoginForm-Modell instanziiert

③ Diese Codezeile ist der Kern der gesamten Anmeldemethode, zuerst: $model->load( Yii::$ app->request->post()) füllt die Post-Daten in $model, also das LoginForm-Modell. Wenn true zurückgegeben wird, ist das Füllen erfolgreich. Weiter: $model->login(): Führen Sie die login()-Methode in der LoginForm-Klasse aus. Anhand der login()-Methode können Sie erkennen, dass eine Reihe von Überprüfungen durchgeführt werden.

Ansicht

Nach der Implementierung des Modells und des Controllers ist der nächste Schritt der Ansichtsteil. Da der Benutzer Daten eingeben muss, müssen wir in Yii2 ein Formular bereitstellen Generieren Sie schnell das Formular. Der Code lautet wie folgt:

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

Empfohlenes Lernen: yii-Framework

Das obige ist der detaillierte Inhalt vonSo melden Sie sich bei yii an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:yii Was liest du auf Englisch?Nächster Artikel:yii Was liest du auf Englisch?