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

2025-05-27 0 42

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Yii框架实现的验证码、登录及退出功能示例 https://www.kuaiidc.com/72965.html

相关文章

发表评论
暂无评论