热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Yii2认证未前后端分离方式

Yii2认证1.认证认证是鉴定用户身份的过程。它通常使用一个标识符(如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌&#x

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;/*** 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:



/* @var $this yii\web\View */
?>
<h1>admin/index</h1><p>You may change the content of this page by modifyingthe file <code> __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(){//认证&#xff08;检测密码和账号是否正确&#xff09;$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;// 当前用户的身份实例。未认证用户则为 Null 。
$identity &#61; Yii::$app->user->identity; // 当前用户的ID。 未认证用户则为 Null 。
$id &#61; Yii::$app->user->id; // 判断当前用户是否是游客&#xff08;未认证的&#xff09;
$isGuest &#61; Yii::$app->user->isGuest;

这就是Yii 的简单认证。


推荐阅读
  • 这篇文章主要介绍PHP如何使用在全部作用域中始终可用的内置变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • classUser(db.Model):iddb.Column(db.Integer,primary_keyTrue,autoincrementTrue)#自增主键username ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
u02022042
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有