独立开发者系列(11)——登录与鉴权

  从原理上讲,登录很简单,就是输入账号密码和后台的数据库进行匹配,匹配上了就表示登录了,否则没有登录。这里主要总结的问题,用户登录之后,服务器端怎么确定你登录了,认定身份这个问题。

   在刚学会编程人的验证里面,用户+密码登录后,直接返回一个标记islogin=1,这样就表示用户登录了,然后将islogin储存到cookie里面,直接读取cookie,如果直接读取到了cookie里面的字段,则用户登录,否则用户就没有登录。匪夷所思的确认登录的方法,确实在之前的一套源码里面出现过。居然使用cookie来识别用户是否登录到进入了后台,如果登录,就继续走真正登录了的逻辑。对于使用cookie识别用户登录的方法,直接导致admin的登录是摆设,只要将cookie里面的登录uid改成1(也就是管理员) islogin =1 这样就表示用户管理员登录了。
       这里涉及到一个对cookie很浅显的概念,Cookie是一种小型的文本文件,由网站创建并存储在用户的计算机或移动设备上。当用户访问网站时,网站的服务器会发送Cookie到用户的浏览器,浏览器随后会将Cookie保存在本地。这样,每当用户再次访问该网站时,浏览器都会将保存的Cookie发送回网站,使得网站能够识别用户并记住用户的浏览历史、偏好设置等信息。也就是cookie是登陆者存档在本地的信息,是可以被本地用户进行更改的。显然登录不能只依靠客户端的cookie来识别登录,极少数情况下可以使用,比如自己一个人使用的系统,懒得每次都登陆,直接使用cookie里面的存储值。

   大部分的登录,依赖的是客户端一个cookie,服务器端一个session,每次请求,服务器端都是获取该cookie字段进行检测。可以拿一个前面基础的fastadmin网站作为对比,一般php网站有个phpseed参数,复制一个登录账号的phpseed到另外一个浏览器,然后复制之前的登录的URL,可以神奇的发现,该网站在另一个浏览器里面也登录了,第一次实现这个效果的时候,感觉到非常吃惊。其实原理很简单,因为服务器端基本只会验证这个PHPSESSID,你的代码里面没有验证服务器/来源/上下文之类的,依靠PHPSESSID的值进行唯一性认证,自然会将你当成登录了看待。也就是说,绝大部分的小网站,已经可以依赖PHPSESSID来识别用户是否已经登录,这个唯一标志是服务器和客户端每次建立连接的时候,返回给客户端的

        正是基于这个特点,如果一个人想登录你的后台,只要获取到了你的PHPSESSID即可。但是PHPSEEID认证有个巨大的缺陷,它在服务器端是有生存周期的,本质其实是服务器保存了一份自己的COOKIE(我们称之为session机制),包括不限于服务器需要紧急重启导致登录失效(很多游戏平台,每次更新服务器都需要你重新登录就是因为其保存的会话session丢失,需要你重新登录建立一次新链接),又或者到了生命周期(由脚本代码的配置决定)又或者客户端关闭了网站(一般关闭网站,会直接导致PHPSESSID被删除),这个时候,你复制出去的session是无效的,因为已经失效了。更不用说,前后端是分离的,对后端的每次请求,都不可能带着一个这样不可控的参数。

  在这种情况下,推出了token的概念,token是一个类似phpsessid的一种升级的解决方式,我们只需要用一种对称加密方法(也就是我们自己可以通过我们的key进行解密,其他人在不知道key的情况下,理论上无法解密信息)。用token来鉴权,最少有三个很明显的好处——
   第一,密文有意义,可以储存类似用户uid之类的关键信息
       第二,不必在于用户是否关闭了浏览器,服务器是不是重启了,甚至不用在乎到底是哪台服务器,只要接收了该token,并能解密,我们服务器就可以继续为该客户端服务

       第三 方便代码层面管理控制,依赖脚本底层机制管理我们并不知道其是否能按照我们的设想运行,但是加密解密是我们自己代码控制的,一定是可以随时让其失效。

  于是很快,使用token加密的方式明显铺开。这个时候,我们只需要解决怎么进行对称加密的难题即可。所幸,每个语言都有这种语言加密函数库,加密的算法比较复杂,我们不用深究,只需要简单引入即可使用。例如PHP里面的
openssl_decrypt($data, 'AES-128-ECB', $key, 0); 加密数据,加密方法,加密的key,位移 解密openssl_encrypt($data, 'AES-128-ECB', $key, 0); PYTHON里面的from cryptography.fernet import Fernet 库也可以类似效果。

       也就是我们将一个字符串进行加密运算之后,丢到服务器端,并设置其为我们的token,然后规定用户每次需要进行操作的时候,都必须带token参数,可以cookie携带,也可以header携带,或者直接字段里面发送,服务器端拿到token之后,根据自有的key进行解密,最后还原出加密的字符串,同时我们可能储存了对应的uid信息在token里面,这样我们甚至无需用户端再次给我们发送uid这个参数,就已经能识别用户身份。很多登录后,进行的操作,都是依赖token对身份的唯一性操作,都是依赖传递的token,只是很多传递方式比较隐蔽。

小结:单一cookie验证身份不可靠,只依赖服务器端的session识别身份会让用户关闭浏览器后,无法识别用户身份,也会让分布式部署的服务器无法识别用户身份,所以用token鉴权优势明显

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748020.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

德力西空调漏电保护开关HDF-LB32A40A家用电热水器漏电保护器开关

品牌 德力西 型号 HDF-LB 额定电流 40A,32A 漏电保护器类型 2P 产地 中国大陆 电压 1000V及以下 极数 2P 电源方式 交流电 3C证书编号 2020960306000014 独有外观,纤薄时尚,家用漏电保护开关,防触电,漏电保…

C语⾔数据类型和变量

C语⾔数据类型和变量 1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&#…

最新AI智能聊天对话问答系统源码(详细图文搭建部署教程)+AI绘画系统,DALL-E3文生图, Whisper TTS 语音识别,文档分析

一、人工智能 随着人工智能技术的持续进步,AI绘画已经发展成为一个日益成熟的领域。越来越多的人开始尝试使用AI绘画软件来创作艺术作品。尽管这些AI绘画软件对绘画领域产生了显著影响,但它们并不会完全取代画师。与传统手绘不同,AI绘画可以…

【C++】运算符重载(日期类的实现)

文章目录 前言一、运算符重载的概念和意义二、运算符重载的规则三、常用运算符重载1.关系运算符重载2.赋值运算符重载3.、-、、-重载4.前置和后置重载5.流插入<<和流提取>>重载 前言 之前在总结类的六个默认成员函数时&#xff0c;没有过多介绍运算符重载&#xf…

实时显示用户输入PySide6实例

如何用 PySide6 实现QLabel 实时显示用户在 QLineEdit 内输入的内容&#xff1f; 示例代码&#xff1a; # QLineEdit 用户输入内容&#xff0c;QLabel 即时显示用户输入训练from PySide6.QtWidgets import (QApplication, QWidget,QLabel, QLineEdit, QVBoxLayout)class MyWi…

ROS学习记录:Hector_Mapping建图的参数设置

前言 launch文件启动Hector_Mapping的建图功能 在上一篇文章&#xff08;以上链接&#xff09;通过launch文件启动了Hector_Mapping建图功能&#xff0c;这一篇文章将在launch文件里给Hector_Mapping设置参数 一、Hector_Mapping有哪些参数 1、浏览器搜索并进入 ROS index 2…

Redis-实战篇-编码解决商铺查询的缓存穿透问题(缓存空对象)

文章目录 1、缓存穿透2、常见的解决方案有两种&#xff1a;2.1、缓存空对象2.2、布隆过滤器 3、编码解决商铺查询的缓存穿透问题3.1、queryById3.2、RedisConstants.java 1、缓存穿透 缓存击穿是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效…

首次30米空间分辨率生成中国年度耕地栅格数据1986-2021

中国1986-2021年30米分辨率年度耕地数据集 数据介绍 精确、详细且及时的耕地范围信息对于粮食安全保障和环境可持续性至关重要。然而&#xff0c;由于农业景观的复杂性和足够训练样本的缺乏&#xff0c;在大范围下进行高时空分辨率的耕地动态监测仍然具有挑战性&#xff0c;尤其…

1.Android逆向协议-环境搭建

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易锦网校 不是安卓逆向吗&#xff1f;为什么写java代码&#xff1f;因为逆向的时候涉及java语言 JDK环境搭建&#xff1a;JDK是JAVA语…

基于RK3568车载电脑助力日本巴士公司高效完成巴士到站系统项目部署

无处不在的物联网&#xff08;IoT&#xff09;技术已经渗透到了人类生活的各个角落&#xff0c;如日常出行乘坐的公交车上&#xff0c;物联网&#xff08;IoT&#xff09;技术的应用就得到完美诠释&#xff01;其通过公交车上的车载电脑网络与中控室服务器连接来对公交车的运行…

Jira实践案例分享:小米集团如何通过API请求优化、数据治理与AI智能客服等,实现Jira系统的高效运维

日前&#xff0c;Atlassian中国合作伙伴企业日活动在上海成功举办。活动以“AI协同 创未来——如何利用人工智能提升团队协作&#xff0c;加速产品交付”为主题&#xff0c;深入探讨了AI技术在团队协作与产品交付中的创新应用与实践&#xff0c;吸引了众多业内专家、企业客户及…

自定义注解实现幂等

在前面的文章中&#xff0c;我们说过解决消息重复消费的方式中&#xff0c;有一个方式是幂等&#xff0c;那么幂等是怎么实现呢&#xff1f; 面试官&#xff1a;对于MQ中的消息重复消费说说的你的理解 一、定义 首先我们先来了解一下幂等的定义&#xff0c;它指的是同一个操作…

嵌入式Linux系统编程 — 3.7 文件目录与处理

目录 1 文件目录 1.1 文件目录简介 1.2 目录存储形式 2 创建和删除目录 2.1 mkdir创建目录 2.2 rmdir删除空目录 3 opendir打开、 readdir读取以及closedir关闭目录 3.1 打开文件 opendir 3.2 读取目录 readdir 3.3 重置目录起点rewinddir 3.4 关闭目录 closedir 3…

基于DeepNLP AI Store真人点评和ShowCase分享社区-AI for Image Generator

来源 quora 社区: https://deepnlpaistore.quora.com/ github: https://rockingdingo.github.io/deepnlp/store/image_generator 内容 DeepNLP AI Store 网址&#xff1a;http://www.deepnlp.org/store/image-generator 网站针对图像生成类别 Image Generator下多个AI工具如 …

第 28 篇 : SSH秘钥登录

1 生成秘钥 ssh-keygen -t rsa ls -a ./.ssh/一直回车就行了 2. 修改配置 vi /etc/ssh/sshd_config放开注释 公钥的位置修改 关闭密码登录 PubkeyAuthentication yes AuthorizedKeysFile .ssh/id_rsa.pub PasswordAuthentication no3. 下载id_rsa私钥, 自行解决 注意…

Websocket在Java中的实践——自动注册端点

在《Websocket在Java中的实践——握手拦截器》中我们使用握手拦截器实现了路径解析的工作。这个过程略显复杂&#xff0c;因为路径解析这样比较底层的工作应该由框架来解决&#xff0c;而不应该交由开发者来做。本文介绍的自动注册端点的功能就可以很优雅的解决这个问题。 依赖…

GNU、Unix、Linux、Makefile、GCC、GDB、GPL、CentOS 7、Ubuntu之间的关系

全文总结 早期&#xff0c;Unix系统作为一类强大的操作系统&#xff0c;在计算领域奠定了基础。然而&#xff0c;出于对软件自由的追求&#xff0c;Richard Stallman在1983年发起了GNU项目&#xff0c;旨在创建一个完全自由的、与Unix兼容的操作系统。GNU项目不仅倡议软件自由…

初创企业合规管理中的企业合规义务边界问题

在初创企业的迅猛发展过程中&#xff0c;合规管理是确保公司可持续成长和避免潜在风险的关键因素。而在合规管理中&#xff0c;界定企业边界尤为重要&#xff0c;它关系到企业如何合理规划业务范围、管理内部外部关系以及维护企业形象和法律责任的清晰。 一、初创企业面临的合…

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…

flink-触发器Trigger和移除器Evictor

Trigger 触发器 触发器作用&#xff1a;控制窗口什么时候除法计算。即执行窗口函数&#xff1b;基于WindowStream调用trigger&#xff08;&#xff09;方法&#xff0c;传入自定义触发器&#xff08;trigger&#xff09;&#xff1b; 每一个窗口分配器&#xff08;windowAssi…