登录认证(1):登录的基本逻辑及实现思路

登录

在当今的大部分网站、应用、游戏中,为了确保资源的安全性和隐私保护,通常需要用户先进行身份验证(即登录),然后才能使用特定的功能和服务。这样的做法不仅增加了系统安全性,还能够根据用户的偏好提供个性化体验

登录基本逻辑

而登录的基本逻辑很简单:用户输入用户名密码,并发起登录请求,服务端接收到登录请求后,从数据库中查询对应的用户信息,如果能根据用户输入的用户名和密码查询到对应的用户信息,则登录成功,反之登录失败。

简单登录实例

下面是一个简单的员工登录的后端代码示例:

LoginInfo登录结果类

/**
 * 登录成功结果封装类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginInfo {
    // 登录员工的id
    private Integer id;
    private String username;
    private String name;
    // 返回的JWT令牌
    private String token;
}

在登录认证功能中,服务端并不需要响应整个Emp对象,只需要给客户端响应:1.登录员工的唯一标识符id、2.登录员工的用户名、3.登录员工的姓名、4.登录员工的token(用于认证,后面再讲),对此建议根据登录需要的数据封装一个专门用于返回登录结果的LoginInfo类。

Controller

/**
 * 登录控制器
 */
@RestController
@RequestMapping("/login")
@Slf4j
public class LoginController {

    private final EmpService empService;

    @Autowired
    public LoginController(EmpService empService) {
        this.empService = empService;
    }
    
    @PostMapping
    public Result<LoginInfo> login(@RequestBody Emp emp) {
        log.info("员工{}正在登录", emp.getUsername());
        LoginInfo loginInfo = empService.login(emp);
        if (loginInfo != null) {
            log.info("员工{}登录成功", emp.getUsername());
            return Result.success(loginInfo);
        }
        log.info("员工{}登录失败", emp.getUsername());
        return Result.error("用户名或密码错误");
    }
}

Service

/**
 * 员工登录
 * @param emp 登录请求数据封装的Emp实体对象
 * @return LoginInfo员工登录信息
 */
@Override
public LoginInfo login(Emp emp) {
    Emp empLogin = empMapper.getUserByUsernameAndPassword(emp);
    if (empLogin != null) {
        return new LoginInfo(empLogin.getId(), empLogin.getUsername(), empLogin.getName(), "");
    }
    return null;
}

Mapper

/**
 * 员工登录-根据用户名和密码匹配
 * @param emp 登录请求数据封装的Emp实体对象
 * @return 根据username和password查询的Emp对象
 */
@Select("select * from emp where username = #{username} and password = #{password}")
Emp getUserByUsernameAndPassword(Emp emp);

用户登录时先输入用户名和密码,然后客户端向服务端发起登录请求Controller接收请求,将请求数据封装到Emp对象中;然后调用Service中的login方法,login方法将调用mapper中的getUserByUsernameAndPassword方法,将根据请求数据中的用户名和密码从数据库中查询对应的员工,如果能够查询到,就将其数据封装为Emp对象返回给Service,Service将其封装为LoginInfo对象再返回给controller,最后将LoginInfo对象封装为统一响应结果Result响应给客户端。

登录校验

上述代码就是一个简单的登录逻辑,但是在这个逻辑中有一个bug:这个登录功能只实现了登录的功能,但是并没有对登录进行验证,此时用户仍然可以不登录就可以使用特定功能。换句话说,这个登录功能只是一个摆设。所以为了真正实现安全完善的登录功能,我们还要对用户的登录进行校验

登录校验是指:服务端在接收到客户端发起的请求之后,先要对请求进行校验校验发起这个请求的用户是否登录

统一拦截

如果用户已经登录,那么服务端就正常的接收请求,执行业务操作即可;假如用户并未登录,此时就不能允许其执行相关业务操作,并给客户端响应一个错误结果,并跳转至登录界面让用户进行登录。

但是这个校验并不能写在Controller方法中,因为一个程序少说也得有几百个Controller方法处理客户端请求,如果将校验登录逻辑写在Controller方法中,就算逻辑是一样的,也会造成代码的大量重复、臃肿

所以说我们需要在请求到达服务端之前,对请求进行统一拦截,在统一拦截中对登录进行校验。

登录标记

我们向服务端发起请求是基于HTTP协议id,但是我们知道,HTTP协议是一个无状态的协议(详情可以查看这篇文章:Http请求响应——请求),每一次HTTP请求都是独立的,下一次的请求并不会携带上一次请求的数据。换句话说:当我们发起登录请求成功登录之后,再次发起其他业务功能的请求时,服务端是不知道用户是否登录了的。这是因为其他请求并没有携带登录成功之后服务端响应的数据。为了判断用户是否登录,我们就需要在用户登录成功之后,将其登录信息存储起来,标记该用户已经成功登录;然后使用会话技术在登录成功的后续每一次请求中都获取该标记。

如上文所讲解,登录的基本逻辑就应该如图所示:

但是如何使用会话技术实现多次请求中的通信,从而使得登录请求之后的后续请求都获得登录成功的标记,从而成功请求呢?且听下回分解。

 

 

 

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

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

相关文章

音乐播放器实现:前端HTML,CSS,JavaScript综合大项目

音乐播放器实现:前端HTML&#xff0c;CSS&#xff0c;JavaScript综合大项目 项目概述项目视图效果一、侧边栏相关代码&#xff08;一&#xff09;HTML代码&#xff08;二&#xff09;css代码 二、登录页面&#xff08;一&#xff09;HTML代码&#xff08;二&#xff09;css代码…

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

Android系统开发(十四):跨进程通讯的隐形之手AIDL

引言 你是否曾在 Android 开发中为进程间通讯&#xff08;IPC&#xff09;头疼不已&#xff1f;如果是&#xff0c;那么 AIDL 就是你的救星&#xff01;它不仅让跨进程数据传输变得高效&#xff0c;而且还解决了异构环境的兼容性问题。本篇文章将带你深入了解 AIDL&#xff0c…

string类的常用接口及模拟实现

目录 基础知识 常用接口 1>常见构造 2>容量操作 3>访问及遍历操作 1.迭代器 2.反向迭代器 3.范围for 4.auto 4>修改操作 5>非成员函数 其它接口 模拟实现 string.h string.cpp swap() 基础知识 string是一个管理字符的类&#xff0c;定义在std命…

Linux——多线程的控制

Linux——线程的慨念及控制-CSDN博客 文章目录 目录 文章目录 前言 一、线程函数的认识 1、基本函数的回顾 1、线程的创建pthread_create 2、线程阻塞pthread_join 3、线程退出pthread_exit 2、线程的分离pthread_detach 3、互斥锁初始化函数&#xff1a;pthread_mutex_init 4、…

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域&#xff0c;它涉及到网络系统的硬件、软件以及数据的安全保护&#xff0c;确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施&#xff0c;保…

TCP状态转移图详解

状态 描述 LISTEN represents waiting for a connection request from any remote TCP and port. SYN-SENT represents waiting for a matching connection request after having sent a connection request. SYN-RECEIVED represents waiting for a confirming connect…

VUE学习笔记(入门)5__vue指令v-html

v-html是用来解析字符串标签 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

【论文投稿】探秘计算机视觉算法:开启智能视觉新时代

目录 引言 一、计算机视觉算法基石&#xff1a;图像基础与预处理 二、特征提取&#xff1a;视觉信息的精华萃取 三、目标检测&#xff1a;从图像中精准定位目标 四、图像分类&#xff1a;识别图像所属类别 五、语义分割&#xff1a;理解图像的像素级语义 六、计算机视觉…

【Java数据结构】Java对象的比较

元素的比较 基本类型比较 在Java中基本类型比较可以直接比较大小 &#xff0c;返回一个布尔类型&#xff08;true或者false&#xff09;。 int a 10; int b 20; System.out.println(a>b); System.out.println(ab); System.out.println(a<b);对象比较的问题 对象的比…

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

和组合导航一样&#xff0c;也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说&#xff0c;预积分因子可以更方便地整合到现有的优化框架中&#xff0c;从开发到实现都更为便…

Ubuntu 24.04 LTS 更改软件源

Ubuntu 24.04 LTS 修改软件源

【2024年度技术总结】Unity 游戏开发的深度探索与实践

文章目录 前言一、Unity 游戏开发的技术深度总结1、C# 编程基础2、Unity 基础入门3、Unity 实战技巧4、Unity 小技巧分享 二、技术工具与平台的年度使用心得1、学习资源的选择2、开发环境配置3、测试与调试工具 三、技术项目实战经验与成果展示1、【制作100个Unity游戏】专栏2、…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件&#xff0c;修改如下&#xff08;storageclass已设置默认类&#xff09; 117 ## param architecture MySQL archit…

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…

游戏引擎学习第84天

仓库:https://gitee.com/mrxiao_com/2d_game_2 我们正在试图弄清楚如何完成我们的世界构建 上周做了一些偏离计划的工作&#xff0c;开发了一个小型的背景位图合成工具&#xff0c;这个工具做得还不错&#xff0c;虽然是临时拼凑的&#xff0c;但验证了背景构建的思路。这个过…

搭建一个基于Spring Boot的数码分享网站

搭建一个基于Spring Boot的数码分享网站可以涵盖多个功能模块&#xff0c;例如用户管理、数码产品分享、评论、点赞、收藏、搜索等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的数码分享平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …

31、【OS】【Nuttx】OSTest分析(1):stdio测试(一)

背景 接上篇wiki 30、【OS】【Nuttx】构建脚本优化&#xff0c;引入待构建项目参数 最小系统分析完后&#xff0c;下一个能够更全面了解Nuttx的Demo&#xff0c;当然选择OSTest&#xff0c;里面有大量关于OS的测试用例&#xff0c;方便对Nuttx的整体功能有个把握。 stdio_tes…