Yii框架实现的验证码、登录及退出功能示例


Posted in PHP onMay 20, 2017

本文实例讲述了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 "<div>欢迎" . Yii::app()->user->id . ",<a href='" . SITE_URL . "admin/index/logout'>退出</a></div>";
    } else {
      $model = new IndexForm();
      if (isset($_POST['IndexForm'])) {
        $model->attributes = $_POST['IndexForm'];
        if ($model->validate() && $model->login()) {
          echo "<div>欢迎" . Yii::app()->user->id . ",<a href='" . SITE_URL . "admin/index/logout'>退出</a></div>";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
  )
));
?>
  <div class="row">
    <?php echo $form->labelEx($model,'a_account'); ?>
    <?php echo $form->textField($model,'a_account'); ?>
    <?php echo $form->error($model,'a_account'); ?>
  </div>
  <div class="row">
    <?php echo $form->labelEx($model,'a_password'); ?>
    <?php echo $form->passwordField($model,'a_password'); ?>
    <?php echo $form->error($model,'a_password'); ?>
  </div>
  <?php if(CCaptcha::checkRequirements()) { ?>
  <div class="row">
    <?php echo $form->labelEx($model, 'verifyCode'); ?>
    <?php $this->widget('CCaptcha'); ?>
    <?php echo $form->textField($model, 'verifyCode'); ?>
    <?php echo $form->error($model, 'verifyCode'); ?>
  </div>
  <?php } ?>
  <div class="row rememberMe">
    <?php echo $form->checkBox($model,'rememberMe'); ?>
    <?php echo $form->label($model,'rememberMe'); ?>
    <?php echo $form->error($model,'rememberMe'); ?>
  </div>
  <div class="row buttons">
    <?php echo CHtml::submitButton('Submit'); ?>
  </div>
<?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程序设计有所帮助。

PHP 相关文章推荐
MySQL相关说明
Jan 15 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
PHP可变函数的使用详解
Jun 14 PHP
浅析php header 跳转
Jun 17 PHP
php快递单号查询接口使用示例
May 05 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
php版本的cron定时任务执行器使用实例
Aug 19 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 #PHP
Yii框架实现图片上传的方法详解
May 20 #PHP
Yii框架分页实现方法详解
May 20 #PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 #PHP
yii2项目实战之restful api授权验证详解
May 20 #PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 #PHP
PHP那些琐碎的知识点(整理)
May 20 #PHP
You might like
解析php中如何直接执行SHELL
2013/06/28 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
javascript每日必学之封装
2016/02/23 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Python3列表List入门知识附实例
2020/02/09 Python
python实现字符串和数字拼接
2020/03/02 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
高一生物教学反思
2014/01/17 职场文书
财务总经理岗位职责
2014/02/16 职场文书
优秀食品类广告词
2014/03/19 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
党支部考察意见范文
2015/06/02 职场文书
二胎满月酒致辞
2015/07/29 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书