本文实例讲述了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程序设计有所帮助。