本文實例講述了YII2框架中自定義用戶認證模型,完成登陸和注冊操作。分享給大家供大家參考,具體如下:
有些時候我們需要自已定義用戶類,操作自已建的用戶表,來完成登陸和注冊功能。
用戶表結(jié)構(gòu)如下,當然可以根據(jù)自已的需要添加或刪除:
1
2
3
4
5
6
7
8
9
10
|
CREATE TABLE `tb_user` ( `id` int (11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶ID' , ` name ` varchar (32) DEFAULT '' COMMENT '用戶名' , `pwd` varchar (64) DEFAULT '' COMMENT '密碼' , `head_img` varchar (256) DEFAULT '' COMMENT '圖像' , `sex` tinyint(1) DEFAULT '0' COMMENT '性別(0:男,1:女)' , `age` tinyint(3) DEFAULT '0' COMMENT '年齡' , `auth_key` varchar (32) DEFAULT '' COMMENT '認證密鑰' , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT= '用戶表' ; |
然后我們在models下創(chuàng)建MyUser.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<?php namespace app\models; use YII; use yii\db\ActiveRecord; use yii\web\IdentityInterface; //我們自定義自已的用戶操作模型,需要實現(xiàn)IdentityInterface接口中的全部方法 //我們自定義的模型主要實現(xiàn)的是認證邏輯,而yii\web\User是負責管理用戶認證狀態(tài)的,兩者是有區(qū)別的。 class MyUser extends ActiveRecord implements IdentityInterface { //指定操作的表名 public static function tableName() { return '{{%user}}' ; } //通過ID,返回用戶實例 public static function findIdentity( $id ) { return static ::findOne( $id ); } //通過令牌,返回用戶實例,一般用于無狀態(tài)的restful應用 //如果你的應用不需要用到,直接留空就行 public static function findIdentityByAccessToken( $token , $type = null) { return static ::findOne([ 'access_token' => $token ]); } //通過用戶名,返回用戶實例 public static function findByUsername( $name ) { return static ::findOne([ 'name' => $name ]); } //獲取用戶ID public function getId() { return $this ->id; } //獲取用戶認證密鑰 public function getAuthKey() { return $this ->auth_key; } //生成cookie中的authkey public function generateAuthKey() { $this ->auth_key = Yii:: $app ->security->generateRandomString(32); $this ->save(false); } //驗證用戶認證密鑰 public function validateAuthKey( $authKey ) { return $this ->getAuthKey() === $authKey ; } //驗證密碼是否正確,當然我們也可以自已定義加密解密方式 public function validatePassword( $password ) { return Yii:: $app ->security->validatePassword( $password , $this ->pwd); } } |
創(chuàng)建完我們自已的用戶模型類后,我們需要在配置文件中修改成我們自已的,在config\web.php
1
2
3
4
5
6
7
|
'components' => [ // ... 'user' => [ 'identityClass' => 'app\models\MyUser' , 'enableAutoLogin' => true, ], ]; |
然后我們創(chuàng)建一個登陸頁面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php use yii\helpers\Url; ?> <!doctype html> <html lang= "zh-CN" > <head> <meta charset= "UTF-8" > <title>表單提交</title> </head> <body> <form action= "<?php echo Url::toRoute('index/login'); ?>" method= "post" > 姓名:<input type= "text" name= "name" ><br> 密碼:<input type= "password" name= "pwd" ><br> <input type= "submit" value= "登陸" > <input name= "_csrf" type= "hidden" value= "<?php echo \Yii::$app->request->csrfToken; ?>" > </form> </body> </html> |
然后是處理用戶登陸的,表單模型,在models下創(chuàng)建MyUserLogin.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
47
48
49
50
51
52
53
|
<?php namespace app\models; use Yii; use yii\base\Model; class MyUserLogin extends Model { //注意這里要聲明表單中提交過來的變量 public $name ; public $pwd ; //設置驗證 public function rules() { return [ [[ 'name' , 'pwd' ], 'required' ], [ 'pwd' , 'validatePassword' ], ]; } //驗證密碼 public function validatePassword( $attribute , $params ) { if (! $this ->hasErrors()) { $user = $this ->getUser(); if (! $user || ! $user ->validatePassword( $this ->pwd)) { $this ->addError( $attribute , '密碼錯誤' ); } } } //登陸處理 public function login() { if ( $this ->validate()) { $user = $this ->getUser(); //監(jiān)聽事件,登陸前,重新生成authkey YII:: $app ->user->on(\yii\web\User::EVENT_BEFORE_LOGIN, [ $user , 'generateAuthKey' ]); return Yii:: $app ->user->login( $user , 3600 * 24); } return false; } //獲取用戶 public function getUser() { return MyUser::findByUsername( $this ->name); } } |
最后就是我們的控制器代碼
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
|
<?php namespace app\controllers; use YII; use yii\web\Controller; use app\models\MyUserLogin; class IndexController extends Controller { public function actionIndex() { //當前用戶的ID var_dump(YII:: $app ->user->id); //當前用戶是否是游客 var_dump(YII:: $app ->user->isGuest); } public function actionLogin() { if (YII:: $app ->request->isPost) { $model = new MyUserLogin(); $model ->load(YII:: $app ->request->post(), '' ); if ( $model ->login()) { echo '登陸成功' ; } else { echo '登陸失敗' ; } } else { return $this ->renderPartial( 'login' ); } } } |
演示如下:
希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。
原文鏈接:https://www.cnblogs.com/jkko123/p/8665496.html