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

2018-09-07 19:01

阅读:301

  本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

  希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。


评论


亲,登录后才可以留言!