本文实例讲述了Yii框架实现的验证码、登录及退出功能。分享给大家供大家参考,具体如下:
捣鼓了一下午,总算走通了,下面贴出代码。
Model
1
2
3
4
5
6
7
8
9
|
<?php
class Auth extends CActiveRecord {
public static function model( $className = __CLASS__ ) {
return parent::model( $className );
}
public function tableName() {
return '{{auth}}' ;
}
}
|
注:我的用户表是auth,所以模型是Auth.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?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程序设计有所帮助。