项目系列之登录管理

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

一.登录流程:

  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进行通信,以完成用户登录的流程。前端发送登录请求并将用户凭据传递给后端,后端验证凭据并返回登录状态和令牌给前端。前端在接收到令牌后存储在会话中,并在后续的请求中携带该令牌,以便后端可以验证用户的身份。

四.简单逻辑代码

java 复制代码
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的常见情况

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

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

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

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

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

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

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

小结:

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

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

相关推荐
我明天再来学Web渗透6 分钟前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
结衣结衣.20 分钟前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
原野心存23 分钟前
java基础进阶知识点汇总(1)
java·开发语言
无理 Java1 小时前
【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)
java·后端·spring·面试·mvc·框架·springmvc
gobeyye1 小时前
spring loC&DI 详解
java·spring·rpc
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
我是浮夸1 小时前
MyBatisPlus——学习笔记
java·spring boot·mybatis
TANGLONG2222 小时前
【C语言】数据在内存中的存储(万字解析)
java·c语言·c++·python·考研·面试·蓝桥杯
杨荧2 小时前
【JAVA开源】基于Vue和SpringBoot的水果购物网站
java·开发语言·vue.js·spring boot·spring cloud·开源
Leighteen2 小时前
ThreadLocal内存泄漏分析
java