Yii 2 认证
1.认证
认证是鉴定用户身份的过程。它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份。认证是登录功能的基础,这个是官话 说白了认证就是登录。
准备工作:数据库我这里的创建了一张admin 表:
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名' ,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=1
ROW_FORMAT=DYNAMIC
;
1.1 配置认证前的工作
Yii2提供了一个认证的框架,我们只需要去完善这个框架
1.设置用户组件 yii\web\User ;
2.创建一个类实现 yii\web\IdentityInterface 接口
用户组件 yii\web\User 用来管理用户的认证状态。这需要你 指定一个含有实际认证逻辑的认证类 yii\web\User::identityClass。 在以下web应用的配置项中,将用户用户组件 yii\web\User 的 认证类 yii\web\User::identityClass 配置成 模型类 app\models\User
'user' => [ 'loginUrl'=>['admin/login'],'identityClass' => \app\models\Admin::class,'enableAutoLogin' => true,],
认证接口 yii\web\IdentityInterface 的实现
认证类 yii\web\User::identityClass 必须实现包含以下方法的,认证接口 yii\web\IdentityInterface:
yii\web\IdentityInterface::findIdentity():根据指定的用户ID查找 认证模型类的实例,当你需要使用session来维持登录状态的时候会用到这个方法。
yii\web\IdentityInterface::findIdentityByAccessToken():根据指定的存取令牌查找 认证模型类的实例,该方法用于 通过单个加密令牌认证用户的时候(比如无状态的RESTful应用)。
yii\web\IdentityInterface::getId():获取该认证实例表示的用户的ID。
yii\web\IdentityInterface::getAuthKey():获取基于 COOKIE 登录时使用的认证密钥。 认证密钥储存在 COOKIE 里并且将来会与服务端的版本进行比较以确保 COOKIE的有效性。
yii\web\IdentityInterface::validateAuthKey() :是基于 COOKIE 登录密钥的 验证的逻辑的实现
这是我实现接口的模型类:
namespace app\models;use Yii;
use yii\web\IdentityInterface;
class Admin extends \yii\db\ActiveRecord implements IdentityInterface
{public static function tableName(){return 'admin';}public function rules(){return [[['username', 'password'], 'required'],[['username', 'password'], 'string', 'max' => 255],];}public function attributeLabels(){return ['id' => 'ID','username' => '用户名','password' => '密码',];}public static function findIdentity($id){return self::findOne(['id'=>$id]);}public static function findIdentityByAccessToken($token, $type = null){}public function getId(){return $this->id;}public function getAuthKey(){}public function validateAuthKey($authKey){}
}
1.2 用户登录(认证)实现
创建登录表单 Login Form:
namespace app\models;use Yii;
use yii\base\Model;
class LoginForm extends Model
{public $username;public $password;public function rules(){return [[['username','password'],'required']];}public function attributeLabels(){return ['username'=>'用户名','password'=>'密码'];}public function login(){$admin = Admin::findOne(['username' => $this->username]);if ($admin) {if (Yii::$app->security->validatePassword($this->password,$admin->password)) {\Yii::$app->user->login($admin);return true;}else{$this->addError('password','密码错误');}}else{$this->addError('username','用户名不存在');}return false;}
}
在 views/admin/ 中创建index.php ,和login.php
index.php:
?>
<h1>admin/index</h1><p>You may change the content of this page by modifyingthe file <code>&#61; __FILE__; ?></code>.
</p>
login.php:
$form &#61; \yii\bootstrap\ActiveForm::begin();
echo $form->field($model,&#39;username&#39;);
echo $form->field($model,&#39;password&#39;)->passwordInput();echo \yii\bootstrap\Html::submitButton(&#39;登录&#39;,[&#39;class&#39;&#61;>&#39;btn btn-info&#39;]);\yii\bootstrap\ActiveForm::end();
创建admin 控制器 admin Controller:
namespace app\controllers;
use app\filters\RbacFilter;
use app\models\Admin;
use app\models\LoginForm;
use Yii;class AdminController extends \yii\web\Controller
{public function actionLogin(){$model &#61; new LoginForm();$request &#61; \Yii::$app->request;if ($request->isPost) {$model->load($request->post());if ($model->login()){\Yii::$app->session->setFlash(&#39;success&#39;,&#39;登录成功&#39;);return $this->redirect([&#39;admin/index&#39;]);}}return $this->render(&#39;login&#39;,[&#39;model&#39;&#61;>$model]);}public function actionAdd(){$admin &#61; new Admin();$admin->username &#61; &#39;admin&#39;;$admin->password &#61; \Yii::$app->security->generatePasswordHash(&#39;123456&#39;);$admin->save();}public function actionLogOut(){Yii::$app->user->logout();}
}
1.3 查看用户认证状态
可以通过 Yii::$app->user 获得一个 User实例&#xff0c;
$user &#61; Yii::$app->user;
$identity &#61; Yii::$app->user->identity;
$id &#61; Yii::$app->user->id;
$isGuest &#61; Yii::$app->user->isGuest;
这就是Yii 的简单认证。