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 登录密钥的 验证的逻辑的实现
这是我实现接口的模型类:
<?php
namespace app\models;
use Yii;
use yii\web\IdentityInterface;
/**
* This is the model class for table "admin".
*
* @property int $id
* @property string $username 用户名
* @property string $password 密码
*/
class Admin extends \yii\db\ActiveRecord implements IdentityInterface
{
/**
* {@inheritdoc}
*/
public static function tableName()
{
return 'admin';
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['username', 'password'], 'required'],
[['username', 'password'], 'string', 'max' => 255],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'username' => '用户名',
'password' => '密码',
];
}
/**
* 返回主体
* @param int|string $id
* @return void|IdentityInterface|null
*/
public static function findIdentity($id)
{
return self::findOne([
'id'=>$id
]);
// TODO: Implement findIdentity() method.
}
public static function findIdentityByAccessToken($token, $type = null)
{
// TODO: Implement findIdentityByAccessToken() method.
}
public function getId()
{
return $this->id;
// TODO: Implement getId() method.
}
public function getAuthKey()
{
// TODO: Implement getAuthKey() method.
}
public function validateAuthKey($authKey)
{
// TODO: Implement validateAuthKey() method.
}
}
1.2 用户登录(认证)实现
创建登录表单 Login Form:
namespace app\models;
use Yii;
use yii\base\Model;
/**
* LoginForm is the model behind the login form.
*
* @property User|null $user This property is read-only.
*
*/
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) {
//用户存在
//对比用户密码
//没有加密 $admin->password == $model->password
//md5 加密 $admin->password == md5($model->password)
//yii2框架密码加密
//密码加密
//$password_hash = \Yii::$app->security->generatePasswordHash('明文密码');
//验证密码
//$result = \Yii::$app->security->validatePassword('明文密码','密文');
//对比用户密码
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:
<?php
/* @var $this yii\web\View */
?>
<h1>admin/index</h1>
<p>
You may change the content of this page by modifying
the file <code><?= __FILE__; ?></code>.
</p>
login.php:
<?php
$form = \yii\bootstrap\ActiveForm::begin();
echo $form->field($model,'username');
echo $form->field($model,'password')->passwordInput();
echo \yii\bootstrap\Html::submitButton('登录',['class'=>'btn btn-info']);
\yii\bootstrap\ActiveForm::end();
创建admin 控制器 admin Controller:
<?php
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 = new LoginForm();
$request = \Yii::$app->request;
if ($request->isPost) {
$model->load($request->post());
if ($model->login()){
//登录成功
\Yii::$app->session->setFlash('success','登录成功');
return $this->redirect(['admin/index']);
}
}
//没有成功者继续输入
return $this->render('login',['model'=>$model]);
}
//添加用户
public function actionAdd()
{
$admin = new Admin();
$admin->username = 'admin';
$admin->password = \Yii::$app->security->generatePasswordHash('123456');
$admin->save();
}
//注销
public function actionLogOut()
{
Yii::$app->user->logout();
}
}
1.3 查看用户认证状态
可以通过 Yii::$app->user 获得一个 User实例,
$user = Yii::$app->user;
// 当前用户的身份实例。未认证用户则为 Null 。
$identity = Yii::$app->user->identity;
// 当前用户的ID。 未认证用户则为 Null 。
$id = Yii::$app->user->id;
// 判断当前用户是否是游客(未认证的)
$isGuest = Yii::$app->user->isGuest;
这就是Yii 的简单认证。