• 技术文章 >后端开发 >php教程

    有关Yii框架实现验证码、登录及退出功能实例讲解

    巴扎黑巴扎黑2017-08-13 14:34:36原创580
    这篇文章主要介绍了Yii框架实现的验证码、登录及退出功能,结合具体实例形式分析了基于Yii框架实现的用户验证登录及退出操作相关步骤与操作技巧,需要的朋友可以参考下

    本文实例讲述了Yii框架实现的验证码、登录及退出功能。分享给大家供大家参考,具体如下:

    捣鼓了一下午,总算走通了,下面贴出代码。

    Model


    <?php
    class Auth extends CActiveRecord {
      public static function model($className = __CLASS__) {
        return parent::model($className);
      }
      public function tableName() {
        return '{{auth}}';
      }
    }

    注:我的用户表是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('verifyCode', 'captcha', 'allowEmpty' => !CCaptcha::checkRequirements(), 'message'=>'请输入正确的验证码'),
          array('a_account', 'required', 'message' => '用户名必填'),
          array('a_password', 'required', 'message' => '密码必填'),
          array('a_password', 'authenticate'),
          array('rememberMe', 'boolean'),
        );
      }
      public function authenticate($attribute, $params) {
        if (!$this->hasErrors()) {
          $this->_identity = new UserIdentity($this->a_account, $this->a_password);
          if (!$this->_identity->authenticate()) {
            $this->addError('a_password', '用户名或密码不存在');
          }
        }
      }
      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(
          'a_account'   => '用户名',
          'a_password'   => '密码',
          'rememberMe'  => '记住登录状态',
          'verifyCode'  => '验证码'
        );
      }
    }

    注:IndexForm也可以写成LoginForm,只是系统内已经有了,我就没有替换它,同时注意看自己用户表的字段,一般是password和username,而我的是a_account和a_password

    Controller


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

    注:第一个方法是添加验证码的

    view


    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <?php
    $form = $this->beginWidget('CActiveForm', array(
      'id'            => 'login-form',
      'enableClientValidation'  => true,
      'clientOptions'       => array(
        'validateOnSubmit'   => true
      )
    ));
    ?>
      <p class="row">
        <?php echo $form->labelEx($model,'a_account'); ?>
        <?php echo $form->textField($model,'a_account'); ?>
        <?php echo $form->error($model,'a_account'); ?>
      </p>
      <p class="row">
        <?php echo $form->labelEx($model,'a_password'); ?>
        <?php echo $form->passwordField($model,'a_password'); ?>
        <?php echo $form->error($model,'a_password'); ?>
      </p>
      <?php if(CCaptcha::checkRequirements()) { ?>
      <p class="row">
        <?php echo $form->labelEx($model, 'verifyCode'); ?>
        <?php $this->widget('CCaptcha'); ?>
        <?php echo $form->textField($model, 'verifyCode'); ?>
        <?php echo $form->error($model, 'verifyCode'); ?>
      </p>
      <?php } ?>
      <p class="row rememberMe">
        <?php echo $form->checkBox($model,'rememberMe'); ?>
        <?php echo $form->label($model,'rememberMe'); ?>
        <?php echo $form->error($model,'rememberMe'); ?>
      </p>
      <p class="row buttons">
        <?php echo CHtml::submitButton('Submit'); ?>
      </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 'demo'.
       * 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
          'demo'=>'demo',
          'admin'=>'admin',
        );
        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('a_account=:name',array(':name'=>$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中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 退出 登录
    上一篇:Yii框架使用魔术方法实现跨文件调用功能示例 下一篇:利用Laravel事件系统完成登录日志记录的相关方法介绍
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一个有趣的命令:php -S(小技巧分享)• 2022最新浅析PHP特性、内核及架构• 学习phpcms开源产品如何入手 • PHP命名空间和自动加载类• PHP开发者常犯的MySQL错误
    1/1

    PHP中文网