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;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值