如何设计一个可扩展的登录功能

news/2024/4/29 7:17:23/文章来源:https://blog.csdn.net/w13528476101/article/details/126907433

本文主要分享了如何设计一个可扩展的登录功能。

一、多种登录方式(需要有一个唯一值来绑定各种登录方式,目前业界用的比较多的是手机号)

1.用户名+密码登录

最原始的登录方式,这种登录方式与注册功能是分开的,业界慢慢放弃这种方式了

2.手机号+验证码登录

业界大部分使用的登录方式,这种登录方式与注册功能是一体实现的,但这种方式存在短信验证码获取体验问题

3.本机号码一键登录

基于方式2的优化,把登录体验做到极致

4.第三方授权登录(如微信、微博、QQ等)

登录方式的优化,登录体验可以做到跟方式3一样,这里的授权是指微信、微博、QQ等第三方平台授权登录时获取的code,根据这个code可以获取第三方平台的用户信息(如openid、unionid)

5.手机号+验证码登录+绑定第三方授权

作为方式4的补充,一般是方式4完成的情况下进行。通常情况下授权登录后并不知道用户是否已存在账号,需要引入手机号来做唯一值校验

二、在微服务中设计一个认证服务,以上的登录方式统一在认证服务中实现

1.C端API大致可以简单分为两种,一种是需用户登录后可访问,另一种是无需登录也可访问

2.请求不带token,肯定是未登录的;带了token,也不一定登录的,可能token是失效的

3.如果带了token,在网关进行统一处理,解析token获取里面的用户ID(生成token时设置进去的)并设置到header在微服务内部传递,如果token过期了则不要设置到header

4.BFF层的微服务自行根据header能否取到用户ID来判断用户是否登录,如果是需要登录后才能访问的API且无用户ID,则响应固定的错误码,与前端同事约定响应该错误码就引导登录

5.登录的请求转发到认证服务,注册/登录一体化,响应token给到前端,前端把token做本地存储,后续的所有请求都带上token

三、核心代码

1.登录接口代码

2.解析token获取用户ID并将设置到header

3.根据header有无用户ID拦截需登录API

四、存储表结构

CREATE TABLE `bu_user_info` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`nickname` varchar(32) DEFAULT NULL COMMENT '昵称',`avator` varchar(32) DEFAULT NULL COMMENT '头像',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
CREATE TABLE `bu_user_oauth` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`user_id` int(11) NOT NULL COMMENT 'bu_user_info.id',`identity_type` varchar(32) NOT NULL COMMENT '账号类型(mobile:手机号,wx-unionid:微信unionid,wx-openid-miniapp:微信小程序openid,wx-openid-mp:微信公众号openid,email:邮箱,username:用户名,sina:新浪微博,qq:QQ)',`identifier` varchar(32) NOT NULL COMMENT '手机号、邮箱、用户名或第三方应用的唯一标识',`certificate` varchar(255) DEFAULT NULL COMMENT '凭证(站内的保存密码,站外的不保存或保存token)',`remark` varchar(255) DEFAULT NULL COMMENT '备注',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uniq_ui_it` (`user_id`,`identity_type`),UNIQUE KEY `uniq_identifier_it` (`identifier`,`identity_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户认证表';

怎么样?如果你觉得有用的话,还不快快收藏起来!!!

附:涉及的代码目录

github:GitHub - 897665787/springcloud-template

gitee:springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。

springcloud-template
└── template-auth└── authentication└── LoginService -- 登录抽象定义└── AppWeixinService -- APP微信授权登录└── LocalMobileService -- 本机号码一键登录└── MobileCodeBindService -- 手机号+验证码登录并绑定授权码└── MobileCodeService -- 手机号+验证码登录└── UsernamePasswordService -- 用户名+密码登录└── WeixinMiniappService -- 微信小程序登录└── WeixinMpService -- 微信公众号登录└── LoginType -- 多种登录方式定义└── controller└── AccountController -- 登录API└── token└── TokenService -- token抽象定义
└── template-framework-edge└── interceptor└── AccessControlConfigurer└── AccessControlInterceptor -- 根据header有无用户ID拦截需登录API
└── template-zuul或template-gateway└── filter└── TokenFilter -- 解析token获取用户ID并将设置到header

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

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

相关文章

网课查题公众号搭建教程(内附接口、源码)

网课查题公众号搭建教程(内附接口、源码) 本平台优点:免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库:题库后台http://daili.j…

Windows11+Ubuntu 3系统如何安全地删掉最后一个Ubuntu系统?

文章目录Windows11Ubuntu 3系统如何安全地删掉最后一个Ubuntu系统?3系统是什么?第一步:删掉Ub16第二步:重启进入grub命令行第三步:从grub命令行中手动启动ubuntu20第四步:进入Windows11更新开机启动项grub配…

LeetCode 0304. 二维区域和检索 - 矩阵不可变

【LetMeFly】304.二维区域和检索 - 矩阵不可变 力扣题目链接:https://leetcode.cn/problems/range-sum-query-2d-immutable/ 给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为…

3、Android 活动Activity(4)(为活动补充附加信息)

在意图之外给活动添加额外的信息, 首先可以把字符串参数放到字符串资源文件中,待App运行之时再从资源文件读取字符串值; 接着还能在AndroidManifest.xml中给指定活动配置专门的元数据,App运行时即可获取对应活动的元数据信息&…

C#使用winform做一个开关小游戏

成品展示 游戏原理: 游戏时,任意点击一个格子,其自身状态改变,且上下左右四个格子的状态也进行变化,即:原来是开的变成关的,原来是关的变成开的。 制作过程 1.建项目会的吧。 2.设置游戏窗…

TCP重传,滑动窗口,流量控制,拥塞控制

重传机制 超时重传快速重传SACKD-SACK 超时重传 RTT 就是 数据从网络一端传送到另一端所需要的时间,也就是包的往返时间。 超时重传时间以 RTO 表示,应该略大于RTT。 如果超时重发的数据,再次超时时有需要重传,TCP的策略是超…

[需求管理-2]:什么是需求以及需求的收集与识别

目录 第1章 什么是需求识别 第2章 需求的来源 2.1 外部需求(收集) 2.2 内部需求(开发) 第3章 需求的层次 第4章 需求的形式 4.1 提问题(针对业务层次需求、原始性需求):第一性原理 4.2 …

视觉SLAM十四讲_4李群与李代数

本文为b站视频的一个笔记 在SLAM中,我们经常要解下面一个问题 FminJ(T)Σi1N∣∣zi−Tpi∣∣2F minJ(T) \Sigma_{i1}^N||z_i - Tp_i||^2FminJ(T)Σi1N​∣∣zi​−Tpi​∣∣2 这个问题中, T是位姿变量。对于求最小值问题,我们第一步就要求函数对于变量…

Java小白踩坑录上

文章目录1、Java小白踩坑录 - String和char2、Java小白踩坑录 - Random 揭秘3、Java小白踩坑录 - B计划之Java资源如何释放?4、Java小白踩坑录 - 反射到底有多慢?5、Java小白踩坑录 - 数组 & List6、Java小白踩坑录 - Java类型的七十二变揭秘7、Java…

IDEA生成带参数和返回值注解

文章目录步骤说明打开IDEA进入 - 设置 - 编辑器 - 活动模板现象一:IDEA提示悬空的注解现象二:IDEA提示标签说明已丢失使用范围设置注解使用步骤说明 打开IDEA进入点击左上角 - 文件 - 设置 - 编辑器 - 活动模板 新建活动模板 填写模板文本 编辑变量 …

2.canal服务器配置及java客户端

【README】 1.本文总结自 B站《尚硅谷-canal》; 2.canal 介绍,可以参考 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 3. canal服务器配置包括 mysql配置,canal配置等; 4.mysql服务器,ca…

完美且简要,如此输出风控中的重要数据指标曲线(如KS等)

先前,我们用excel给大家演示过一个KS的计算方式。 ks值是在模型中用于区分预测正负样本分隔程度的评价指标。每个样本的预测结果化对应的一个个分数,从最低分到最高分,输出为正负样本的累积分布。Ks值为这个两个正负样本中,最大差…

听吧音乐项目测试

听吧音乐项目 听吧音乐测试1.项目背景2.需求分析2.1 用户需求2.2 软件需求3. 测试点分析及测试用例4. 自动化测试代码4.1 注册登录注销模块自动化测试代码4.2 专辑播放自动化测试代码5. 测试报告1.项目背景 听吧音乐是一个在线听歌网站,游客通过首页可以在线收听其…

WinUI 3 踩坑记:第一个窗口

本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,文中的代码也在此仓库中,若内容出现冲突以 GitHub 上的为准。WinUI 3 应用的入口和 UWP 类似,也是继承自 Application 的一个类,略有不同的是没有 UWP 那么多的启动方式可供重写,只有一个 OnLau…

python计算离散积分

前言 本文是傅立叶及其python应用系列的第一篇文章对应的仓库地址为https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series 介绍 本篇文章将要介绍一个非常小众的scipy函数:simpson. 这个函数的一大功能就是可以对离散数据积分。之所以要介…

P39 事件处理

P39 事件处理1.事件模型的流程2.事件监听器2.1 动作监听器(ActionListener)2.2 焦点监听器(FocusListener)2.3 鼠标监听器(MouseListener)2.4 鼠标移动/拖动监听器(MouseMotionListener&#xf…

SpringAOP的概述与实现

目录 SpringAOP的概述 什么是AOP AOP能干什么 AOP的特点 AOP底层实现 AOP基本概念 连接点 切入点 通知 切面 目标对象 织入 引入 谈谈你对AOP的理解? SpringAOP的实现 依赖引用 spring.xml配置 注解实现 1.定义切面 设置通知 2.开启aop 3.测试 …

金仓数据库KingbaseES客户端编程开发框架-MyBatis(2. 概述 3. MyBatis配置说明)

2. 概述 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息, 将接口和 Java 的 POJOs(Plain Old Ja…

Sourcemap 配置详解

前言 之前在脚手架工具内整合将sourcemap上传sentry能力的时候,考虑bundle分割对.map文件关联的限制:比如TerserWebpackPlugin(JS压缩)只对 devtool 选项的 source-map,inline-source-map,hidden-source-m…

后端研发工程师面经——JAVA语言

文章目录2. JAVA语言2.1 面向对象的三大特性2.2 JAVA异常2.2.1 异常产生的原因2.2.2 异常的分类2.2.3 异常的处理方式2.3 序列化和反序列化2.3.1 概念2.3.2 JAVA中的序列化和反序列化2.3.3 序列化和反序列化的接口2.3.4 Serialization接口详解2.3.5 Externalizable接口详解2.3.…