项目系列之登录管理

登录管理是现代计算机系统中关键的组成部分之一。那么本篇博客我们来简单了解一下登录的流程与前后端干了啥事。

一.登录流程:

  1. 用户打开登录页面: 用户访问应用程序或网站的登录页面。此页面通常包含用户名/邮箱输入字段和密码输入字段,以及登录按钮。

  2. 用户输入凭据: 用户在登录页面上输入其已注册的用户名/邮箱和相应的密码。

  3. 客户端验证: 用户点击登录按钮后,客户端(通常是浏览器)会对输入的凭据进行验证。这些验证可以包括对输入字段的格式验证、检查输入是否为空等。

  4. 凭据传输到服务器: 客户端使用安全的方式(如HTTPS)将用户输入的凭据发送到服务器端。

  5. 服务器端验证: 服务器端接收到用户登录请求后,会进行进一步的验证。这些验证包括以下几个方面:

    • 用户名/邮箱存在性验证:检查用户输入的用户名/邮箱是否存在于系统的用户数据库中。
    • 密码验证:比对用户输入的密码和存储在数据库中的密码的哈希值是否匹配。
    • 可能的其他验证:根据具体需求,服务器端可能还会进行其他验证,例如检查用户账号的状态(是否被封禁等)。
  6. 生成登录令牌: 如果用户的凭据通过了服务器端的验证,服务器会为该用户生成一个登录令牌(也可以称为会话令牌或访问令牌)。登录令牌是一个唯一的标识符,用于在用户会话期间验证用户的身份。

  7. 将登录令牌返回给客户端: 服务器将登录令牌发送回客户端作为响应。通常,登录令牌会存储在客户端的浏览器会话(如cookie)中,以便后续的请求可以携带该令牌以验证用户的身份。

  8. 登录成功: 如果用户的凭据验证成功并且登录令牌已经成功生成并返回给客户端,服务器端会将登录状态设置为已认证,并将用户重定向到登录后的页面或主页。

  9. 会话管理: 在用户完成登录后,服务器会根据登录令牌来管理用户的会话。这可以包括验证每个后续请求中的令牌、检查会话的有效期是否过期等。

  10. 登出: 当用户主动点击登出按钮或会话失效时,客户端会发送登出请求给服务器。服务器会将用户的登录状态设置为未认证,并删除与该用户关联的登录令牌。

二.cookie与session的变化

  1. 存储位置:

    • Cookie:Cookie是由浏览器在客户端存储的小型文本文件。浏览器会将Cookie存储在用户的计算机或移动设备上,每次发送请求时都会自动附加到请求头中。
    • Session:Session是在服务器端存储的用户会话信息。服务器会为每个用户分配一个唯一的会话标识符,并将相关信息存储在服务器上的内存或持久化存储中(如数据库或缓存)。
  2. 数据存储:

    • Cookie:Cookie通常包含一小段文本,其中存储有关用户的标识数据(如会话ID或用户ID)。Cookie可以设置过期时间,可以被其他网站访问(如果未设置限制),并且每次请求都会自动发送到服务器。
    • Session:Session存储在服务器上,通常以键值对的形式存储用户的会话信息。关于用户的其他数据(如用户角色、权限等)可以存储在Session中,并且只有在服务器上进行读取和写入。
  3. 安全性:

    • Cookie:Cookie在客户端存储,因此对于安全性有一定的风险。为了增加安全性,Cookie可以通过设置标志来限制跨站点访问(Secure Flag)和JavaScript访问(HttpOnly Flag)。
    • Session:Session在服务器端存储,因此相对于Cookie更安全。只有服务器可以访问和修改Session数据。
  4. 生命周期:

    • Cookie:Cookie可以设置过期时间,可以长期保持在客户端,即使用户关闭浏览器。持久性Cookie在未过期之前都会被发送到服务器。
    • Session:Session通常在用户关闭浏览器或一段时间不活动后过期。会话过期后,用户必须重新进行身份验证。

三.前后端的操作

前端操作:

  1. 界面设计:前端开发人员负责设计和开发用户登录页面。该页面通常包括用户名/邮箱输入字段、密码输入字段和登录按钮。
  2. 用户输入验证:前端通过JavaScript验证用户输入的凭据是否符合要求,例如检查输入字段是否为空、用户名是否符合特定格式等。
  3. 凭据传输:在用户点击登录按钮后,前端通过使用安全的方式(如HTTPS)将用户输入的凭据传输到后端服务器。
  4. 错误处理:前端应该能够处理后端返回的登录错误,并向用户提供相关的错误信息。例如,用户名或密码错误等。

后端操作:

  1. 接收请求:后端服务器接收前端传输过来的用户凭据,通常使用HTTP请求来接收登录请求。
  2. 验证用户凭据:后端通过以下步骤验证用户凭据:
    • 用户名/邮箱存在性验证:检查用户输入的用户名/邮箱是否存在于系统的用户数据库中。
    • 密码验证:将用户输入的密码与数据库中存储的密码进行比对,通常是比对密码的哈希值。
    • 其他验证:根据应用需求,还可以进行其他验证,例如检查用户账号的状态(是否被封禁等)。
  3. 生成登录令牌:如果用户的凭据验证成功,后端会生成一个登录令牌(也称为会话令牌或访问令牌)。该令牌用于在用户会话期间验证用户的身份。令牌通常是加密的,并包含用户的身份信息和其他必要的权限信息。
  4. 返回登录状态和令牌:后端将登录状态设置为已认证,并将登录令牌返回给前端。通常,令牌会被存储在浏览器的会话(如cookie)中,以便后续的请求可以携带该令牌以验证用户的身份。
  5. 会话管理:后端根据登录令牌进行会话管理。这可以包括验证每个后续请求中的令牌、检查会话的有效期是否过期等。如果用户主动登出或会话失效,后端会将登录状态设置为未认证,并删除与用户关联的登录令牌。

前端和后端的合作: 前端和后端需要通过API进行通信,以完成用户登录的流程。前端发送登录请求并将用户凭据传递给后端,后端验证凭据并返回登录状态和令牌给前端。前端在接收到令牌后存储在会话中,并在后续的请求中携带该令牌,以便后端可以验证用户的身份。

四.简单逻辑代码

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class UserLoginModule {private Map<String, String> users;public UserLoginModule() {users = new HashMap<>();users.put("user1", "password1");users.put("user2", "password2");users.put("user3", "password3");}public boolean login(String username, String password) {if (users.containsKey(username) && users.get(username).equals(password)) {System.out.println("Login successful!");return true;} else {System.out.println("Login failed. Invalid username or password.");return false;}}public static void main(String[] args) {UserLoginModule loginModule = new UserLoginModule();Scanner scanner = new Scanner(System.in);System.out.print("Enter username: ");String username = scanner.nextLine();System.out.print("Enter password: ");String password = scanner.nextLine();loginModule.login(username, password);}
}
  • UserLoginModule存储一个映射users,其中包含用户名作为键和密码作为值。在构造函数中,我们使用一些示例用户数据填充地图。
  • login方法将用户名和密码作为参数,并检查它们是否与映射中的条目匹配users。如果用户名和密码组合有效,则会打印“登录成功!” 并返回true。否则,它会打印“登录失败。用户名或密码无效。” 并返回false
  • 在该main方法中,我们创建一个实例UserLoginModule并提示用户使用该类输入用户名和密码Scanner。然后我们调用该login方法来执行登录操作。
  • 五.token

  • 在登录用户模块中,通常使用令牌(token)用于身份验证和授权目的。令牌是一个具有一定时效性的凭证,用于验证用户的身份并授予其对受保护资源的访问权限。
  • token的常见情况

  • 登录令牌生成:用户当成功进行身份验证并通过登录流程时,登录模块会生成一个登录令牌并返回给客户端。该登录令牌通常为一个长字符串,可以包含用户识别信息及其他必要信息信息。

  • 令牌令牌:登录令牌通常具有一定的长度,即在一段时间后到期。令牌的长度可能是固定的,也可以根据系统需求进行动态调整。一旦令牌过期,用户需要重新进行身份验证以获取新的令牌。

  • 刷新令牌:为了延长用户登录的效果,某些系统使用刷新令牌来获取新的访问令牌。刷新令牌与登录令牌不同,它通常具有更长的有效性,并用于向服务器认证请求新的访问令牌。使用刷新令牌可以减少频繁的登录操作,提供更好的用户体验。

  • 更新令牌:在某些情况下,令牌的信息可能需要更新。例如,当用户更改密码或更改了账户相关的敏感信息时,为了保证安全性,系统可能会生成新的令牌并通知用户重新登录。

  • 令牌撤销:在某些情况下,需要撤销令牌,例如用户注销或账户被锁定。当令牌被撤销时,将不再被认可,并且无法访问系统中的资源。

  • 风险令牌刷新策略:系统可以制定一些刷新令牌的策略来平衡安全性和性能。例如,可以限制刷新令牌的使用次数或设置每次刷新的最大剂量。这样可以减少中断和保障系统性能。

  • 多身份验证:除了令牌外,还可以使用其他形式的身份验证来增强安全性,例如短信验证码、指纹识别、手机应用程序生成的一次性密码等。这些附加的身份验证因素可以在登录过程中与令牌结合使用,提供额外的安全保护。

小结:

        登录管理是确保计算机系统安全性的重要组成部分。通过采用适当的登录管理方法和实施安全措施,可以有效地保护用户身份和数据的安全。同时,持续的安全教育和更新也保持登录管理系统安全性的关键。

        像权限的说明等等就不在这里多少了,建议使用现有的权限管理框架或库,并与安全专家合作来保证系统具备适当的权限管理机制。登录系统可是重中之重,望各位重视。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

什么是动态组件以及使用场景

文章目录 一、vue中的动态组件是什么&#xff1f;有什么用&#xff1f;二、使用demo1.tab页签中的使用2.模拟新闻页demo 三、用keep-alive包裹&#xff0c;保持状态总结 一、vue中的动态组件是什么&#xff1f;有什么用&#xff1f; 动态组件指可以动态切换组件的显示和隐藏。…

岩土工程安全监测利器:振弦采集仪的发展

岩土工程安全监测利器&#xff1a;振弦采集仪的发展 岩土工程安全监测是保障建筑物、地下工程和地质环境安全稳定运行的重要手段。传统上&#xff0c;监测手段主要依靠人工巡视以及基础设施安装的传感器&#xff0c;但是这些方法都存在着缺陷。人工巡视存在的问题是数据采集精…

【Vue】详细介绍Vue项目的目录结构及各个核心文件的示例代码

Vue.js并没有严格的文件和目录结构要求&#xff0c;但一般情况下&#xff0c;我们的Vue项目目录结构如下&#xff1a; ├── node_modules/ # 项目依赖的 node 模块 ├── public/ # 公共资源目录 │ ├── favicon.ico # 网页图标 │ └──…

Linux驱动【day2】

mychrdev.c: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h" unsigned int major; // 保存主设备号 char kbuf[128]{0}; unsigned int…

第24节-PhotoShop基础课程-钢笔工具

文章目录 前言1.钢笔工具1.直线绘制2.曲线绘制 按住shift键 垂直/水平/453.添加&#xff0c;减少锚点&#xff08;在路径上点击锚点就可以增加和删除&#xff09;4.移动锚点 Ctrl 左键5.手柄控制 先按住Alt 点击 一个锚点有两个手柄控制点&#xff08;中间点&#xff09;6.加…

【linux基础(五)】Linux中的开发工具(上)---yum和vim

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

4、Nginx 配置实例-反向代理

文章目录 4、nginx 配置实例-反向代理4.1 反向代理实例一4.1.1 实验代码 4.3 反向代理实例二4.3.1 实验代码 【尚硅谷】尚硅谷Nginx教程由浅入深 志不强者智不达&#xff1b;言不信者行不果。 4、nginx 配置实例-反向代理 4.1 反向代理实例一 实现效果&#xff1a;使用 nginx…

窗口函数-分组排序:row_number()、rank() 、dense_rank()、ntile()

窗口函数语法结构&#xff1a; 分析函数() over(partition by 分组列名 order by 排序列名 rows between 开始位置 and 结束位置) 开窗函数和聚合函数区别&#xff1a; 聚合函数会对一组值进行计算并返回一个值&#xff0c;常见的比如sum()&#xff0c;count()&#xff0c;ma…

动态代理JDK与cglib的区别之:如何处理被代理方法中的This调用

关于JDK与cglib动态代理的使用不是本文关注的重点&#xff0c;如有不清楚的同学可以查询相关资料进行了解。本文主要是要讲一下在面对方法存在嵌套调用时JDK与cglib动态代理的区别以及原因。 先看下测试代码&#xff0c;注意下TestProxyJDKImpl的test1方法调用了test2方法即可…

Python入门学习13(面向对象)

一、类的定义和使用 类的使用语法&#xff1a; 创建类对象的语法&#xff1a; ​​​​​​​ class Student:name None #学生的名字age None #学生的年龄def say_hi(self):print(f"Hi大家好&#xff0c;我是{self.name}")stu Student() stu.name &q…

ElementUI浅尝辄止36:Input 输入框

通过鼠标或键盘输入字符 1.如何使用&#xff1f; Input 为受控组件&#xff0c;它总会显示 Vue 绑定值。 通常情况下&#xff0c;应当处理 input 事件&#xff0c;并更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框内显示的值将不会改变。不支…

设置vue 项目浏览器界面关闭或者刷新,询问是否保存内容

可以结合使用JavaScript的window.beforeunload事件和Vue的生命周期钩子函数。 <template> <!-- 组件模板 --> </template> <script> export default { data() { return { // 组件数据 }; }, beforeMount() { window.addEventListener(be…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的&#xff0c;跨平台的解决方案&#xff0c;记录&#xff0c;转换和流音频和视频。 官网&#xff1a;https://ffmpeg.org/ 二、安装 1、Linux&#xff1a; sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

基于googlenet网络的动物种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. % 获取输入层的尺寸 Inp…

Pytorch Advanced(一) Generative Adversarial Networks

生成对抗神经网络GAN&#xff0c;发挥神经网络的想象力&#xff0c;可以说是十分厉害了 参考 1、AI作家 2、将模糊图变清晰(去雨&#xff0c;去雾&#xff0c;去抖动&#xff0c;去马赛克等)&#xff0c;这需要AI具有“想象力”&#xff0c;能脑补情节&#xff1b; 3、进行数…

linux命令-split 命令

split 命令 split命令用于将文件分割成较小的部分。它可以按照文件大小、行数或特定的分隔符来划分文件 [duserxxxx dir2]$ split --help Usage: split [OPTION]... [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 l…

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码&#xff0c;centos 下需先安装 kernel-devel 包&#xff0c;要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块&#xff0c;发到编译环境中 注&#xff1a;就像我自己拷贝一个 bcache 驱动的目…

从零开始在树莓派上搭建WordPress博客网站并实现公网访问

文章目录 序幕概述1. 安装 PHP2. 安装MySQL数据库3. 安装 Wordpress4. 设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 5. WordPress configuration6. 将WordPress站点发布到公网安装相对URL插件修改config.php配置 7. 支持好友链接样式8. 定制主题 序幕 …

算法基础:归并排序(超详细)

归并排序 题目1&#xff1a;归并排序 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&#xff08;所有整数均在 1∼109 范围…