有關Yii框架實作驗證碼、登入及登出功能實例講解

巴扎黑
發布: 2023-03-15 06:48:01
原創
1294 人瀏覽過

這篇文章主要介紹了Yii框架實現的驗證碼、登錄及退出功能,結合具體實例形式分析了基於Yii框架實現的用戶驗證登錄及退出操作相關步驟與操作技巧,需要的朋友可以參考下

本文實例講述了Yii框架實現的驗證碼、登入及登出功能。分享給大家供大家參考,具體如下:

搗鼓了一下午,總算走通了,下面貼出代碼。

Model


<?php
class Auth extends CActiveRecord {
  public static function model($className = __CLASS__) {
    return parent::model($className);
  }
  public function tableName() {
    return &#39;{{auth}}&#39;;
  }
}
登入後複製

註:我的使用者表是auth,所以模型是Auth.php


<?php
class IndexForm extends CFormModel {
  public $a_account;
  public $a_password;
  public $rememberMe;
  public $verifyCode;
  public $_identity;
  public function rules() {
    return array(
      array(&#39;verifyCode&#39;, &#39;captcha&#39;, &#39;allowEmpty&#39; => !CCaptcha::checkRequirements(), &#39;message&#39;=>&#39;请输入正确的验证码&#39;),
      array(&#39;a_account&#39;, &#39;required&#39;, &#39;message&#39; => &#39;用户名必填&#39;),
      array(&#39;a_password&#39;, &#39;required&#39;, &#39;message&#39; => &#39;密码必填&#39;),
      array(&#39;a_password&#39;, &#39;authenticate&#39;),
      array(&#39;rememberMe&#39;, &#39;boolean&#39;),
    );
  }
  public function authenticate($attribute, $params) {
    if (!$this->hasErrors()) {
      $this->_identity = new UserIdentity($this->a_account, $this->a_password);
      if (!$this->_identity->authenticate()) {
        $this->addError(&#39;a_password&#39;, &#39;用户名或密码不存在&#39;);
      }
    }
  }
  public function login() {
    if ($this->_identity === null) {
      $this->_identity = new UserIdentity($this->a_account, $this->a_password);
      $this->_identity->authenticate();
    }
    if ($this->_identity->errorCode === UserIdentity::ERROR_NONE) {
      $duration = $this->rememberMe ? 60*60*24*7 : 0;
      Yii::app()->user->login($this->_identity, $duration);
      return true;
    } else {
      return false;
    }
  }
  public function attributeLabels() {
    return array(
      &#39;a_account&#39;   => &#39;用户名&#39;,
      &#39;a_password&#39;   => &#39;密码&#39;,
      &#39;rememberMe&#39;  => &#39;记住登录状态&#39;,
      &#39;verifyCode&#39;  => &#39;验证码&#39;
    );
  }
}
登入後複製

註:IndexForm也可以寫成LoginForm,只是系統內已經有了,我就沒有替換它,同時注意看自己用戶表的字段,一般是password和username,而我的是a_account和a_password

#Controller


<?php
class IndexController extends Controller {
  public function actions() {
    return array(
      &#39;captcha&#39; => array(
        &#39;class&#39; => &#39;CCaptchaAction&#39;,
        &#39;width&#39;=>100,
        &#39;height&#39;=>50
      )
    );
  }
  public function actionLogin() {
    if (Yii::app()->user->id) {
      echo "<p>欢迎" . Yii::app()->user->id . ",<a href=&#39;" . SITE_URL . "admin/index/logout&#39;>退出</a></p>";
    } else {
      $model = new IndexForm();
      if (isset($_POST[&#39;IndexForm&#39;])) {
        $model->attributes = $_POST[&#39;IndexForm&#39;];
        if ($model->validate() && $model->login()) {
          echo "<p>欢迎" . Yii::app()->user->id . ",<a href=&#39;" . SITE_URL . "admin/index/logout&#39;>退出</a></p>";exit;
        }
      }
      $this->render(&#39;login&#39;, array(&#39;model&#39; => $model));
    }
  }
  public function actionLogout() {
    Yii::app()->user->logout();
    $this->redirect(SITE_URL . &#39;admin/index/login&#39;);
  }
}
登入後複製

註:第一個方法是新增驗證碼的

view


##

<meta http-equiv="content-type" content="text/html;charset=utf-8">
<?php
$form = $this->beginWidget(&#39;CActiveForm&#39;, array(
  &#39;id&#39;            => &#39;login-form&#39;,
  &#39;enableClientValidation&#39;  => true,
  &#39;clientOptions&#39;       => array(
    &#39;validateOnSubmit&#39;   => true
  )
));
?>
  <p class="row">
    <?php echo $form->labelEx($model,&#39;a_account&#39;); ?>
    <?php echo $form->textField($model,&#39;a_account&#39;); ?>
    <?php echo $form->error($model,&#39;a_account&#39;); ?>
  </p>
  <p class="row">
    <?php echo $form->labelEx($model,&#39;a_password&#39;); ?>
    <?php echo $form->passwordField($model,&#39;a_password&#39;); ?>
    <?php echo $form->error($model,&#39;a_password&#39;); ?>
  </p>
  <?php if(CCaptcha::checkRequirements()) { ?>
  <p class="row">
    <?php echo $form->labelEx($model, &#39;verifyCode&#39;); ?>
    <?php $this->widget(&#39;CCaptcha&#39;); ?>
    <?php echo $form->textField($model, &#39;verifyCode&#39;); ?>
    <?php echo $form->error($model, &#39;verifyCode&#39;); ?>
  </p>
  <?php } ?>
  <p class="row rememberMe">
    <?php echo $form->checkBox($model,&#39;rememberMe&#39;); ?>
    <?php echo $form->label($model,&#39;rememberMe&#39;); ?>
    <?php echo $form->error($model,&#39;rememberMe&#39;); ?>
  </p>
  <p class="row buttons">
    <?php echo CHtml::submitButton(&#39;Submit&#39;); ?>
  </p>
<?php $this->endWidget(); ?>
登入後複製

同時修改專案下protected/components下的UserIdentity.php


<?php
/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
  /**
   * Authenticates a user.
   * The example implementation makes sure if the username and password
   * are both &#39;demo&#39;.
   * In practical applications, this should be changed to authenticate
   * against some persistent user identity storage (e.g. database).
   * @return boolean whether authentication succeeds.
   */
  public function authenticate()
  {
    /*
    $users=array(
      // username => password
      &#39;demo&#39;=>&#39;demo&#39;,
      &#39;admin&#39;=>&#39;admin&#39;,
    );
    if(!isset($users[$this->username]))
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    elseif($users[$this->username]!==$this->password)
      $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
      $this->errorCode=self::ERROR_NONE;
    return !$this->errorCode;
    */
    $user_model = Auth::model()->find(&#39;a_account=:name&#39;,array(&#39;:name&#39;=>$this->username));
    if($user_model === null){
      $this -> errorCode = self::ERROR_USERNAME_INVALID;
      return false;
    } else if ($user_model->a_password !== md5($this -> password)){
      $this->errorCode=self::ERROR_PASSWORD_INVALID;
      return false;
    } else {
      $this->errorCode=self::ERROR_NONE;
      return true;
    }
  }
}
登入後複製

以上是有關Yii框架實作驗證碼、登入及登出功能實例講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!