>  기사  >  PHP 프레임워크  >  yii에 로그인하는 방법

yii에 로그인하는 방법

尚
원래의
2019-12-31 14:56:201965검색

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에서 수정되었습니다. 여기에서 다음 코드에 주의하세요.

코드 번호 ①은 규칙 규칙입니다. 데이터를 채우고 채워진 데이터가 올바른지, 형식을 준수하는지 등을 확인합니다. 열 중 하나는 비밀번호이고 해당 규칙은 현재 클래스의 verifyPassword() 메소드입니다. 아래의 User 클래스에 해당하는 메소드와 구별되도록 주의하시기 바랍니다. 코드

②는 User 클래스에서 findByUsername 메서드를 호출합니다. 이 User 클래스는 주로 현재 LoginForm 데이터와 비교할 AR 클래스 인스턴스를 반환하기 위해 아래에 작성됩니다.

3 코드에 대해서는 지금은 여기서 언급하지 않겠습니다. 나중에 쿠키 로그인에 관해 이야기할 때 언급하겠습니다.

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 클래스만 상속하면 됩니다. 하지만 우리 모델의 핵심은 검증이기 때문에 실제 검증은 LoginForm 모델에서 언급한 verifyPassword 처럼 구현하는 것이 당연합니다. 로직은 현재 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에서 설명하지 않습니다.

3getId: 현재 AR 클래스에 해당하는 id를 반환

④getAuthKey: 현재 AR 클래스에 해당하는 auth_key를 반환

⑤validateAuthKey: 이 메서드 가 더 중요합니다. 이는 나중에 이야기할 쿠키 로그인 확인의 핵심입니다.

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에 있습니다. code 에서 이 메서드를 인용하면 사용자가 제출한 사용자 이름을 기반으로 데이터 테이블의 사용자 이름과 동일한 데이터 항목, 즉 AR 인스턴스를 반환하는 것이 목적입니다.

②validatePassword(): 여기서는 사용자가 제출한 비밀번호와 현재 AR 수업의 비밀번호를 비교합니다.

3generateAuthKey(): 쿠키 로그인을 위한 임의의 auth_key를 생성합니다.

총 두 개의 모델 클래스인 LoginForm과 User가 작성되었습니다. 하나는 사용자가 제출한 데이터를 받는 데 사용되고 다른 하나는 데이터베이스에서 데이터를 얻는 데 사용됩니다.

Controller(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-> 현재 사용자 모드가 게스트 모드, 즉 로그인되어 있지 않은지 여부를 결정합니다. 사용자가 로그인되어 있으면 현재 로그인된 사용자의 정보가 user 클래스에 저장됩니다.

②현재 방문자인 경우 LoginForm 모델이 먼저 인스턴스화됩니다.

3이 코드 줄은 전체 로그인 방법의 핵심입니다. 먼저 $model-> load( Yii::$app->request->post())는 게시물 데이터를 $model, 즉 LoginForm 모델에 채웁니다. true가 반환되면 채우기가 성공한 것입니다. 다음: $model->login(): LoginForm 클래스에서 login() 메서드를 실행합니다. login() 메서드에서 일련의 확인이 수행되는 것을 볼 수 있습니다.

View(View)

모델과 컨트롤러를 구현한 후 다음 단계는 뷰 부분입니다. 사용자가 데이터를 입력해야 하기 때문에 폼을 제공해야 합니다. 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>

추천 학습: yiiframework

위 내용은 yii에 로그인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.