今天就跟大家聊聊有關怎么在YII2框架中自定義用戶認證模型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
用戶表結構如下,當然可以根據自已的需要添加或刪除:
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下創建MyUser.php,代碼如下:
<?php
namespace app\models;
use YII;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
//我們自定義自已的用戶操作模型,需要實現IdentityInterface接口中的全部方法
//我們自定義的模型主要實現的是認證邏輯,而yii\web\User是負責管理用戶認證狀態的,兩者是有區別的。
class MyUser extends ActiveRecord implements IdentityInterface
{
//指定操作的表名
public static function tableName()
{
return '{{%user}}';
}
//通過ID,返回用戶實例
public static function findIdentity($id)
{
return static::findOne($id);
}
//通過令牌,返回用戶實例,一般用于無狀態的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);
}
}創建完我們自已的用戶模型類后,我們需要在配置文件中修改成我們自已的,在config\web.php
'components' => [ // ... 'user' => [ 'identityClass' => 'app\models\MyUser', 'enableAutoLogin' => true, ], ];
然后我們創建一個登陸頁面
<?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下創建MyUserLogin.php
<?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();
//監聽事件,登陸前,重新生成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);
}
}最后就是我們的控制器代碼
<?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');
}
}
}演示如下:


看完上述內容,你們對怎么在YII2框架中自定義用戶認證模型有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。