当前位置:首页 > 科技  > 软件

三年探索,登录注册之路仍漫漫

来源: 责编: 时间:2024-06-27 07:57:45 241观看
导读不出意外的话,我猜在座的各位同学,刚刚学编程的时候,80%以上的人写的第一个项目不是学生管理系统,就是用户的登录、注册;需求都是源于生活而高于生活,因为学生对这些场景最为熟悉,功能也相对简单,拿来练手最适合不过了;但是,一

不出意外的话,我猜在座的各位同学,刚刚学编程的时候,80%以上的人写的第一个项目不是学生管理系统,就是用户的登录、注册;需求都是源于生活而高于生活,因为学生对这些场景最为熟悉,功能也相对简单,拿来练手最适合不过了;但是,一个看似小小的登录、注册功能,要想把他真正的做好,并不是一件容易的事情;本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现。GUh28资讯网——每日最新资讯28at.com

业务图解

对于用户登录来说、涉及到了用户注册、登录验证几个方面,通过流程图演示如何处理(新用户/老用户)登录。GUh28资讯网——每日最新资讯28at.com

图片图片GUh28资讯网——每日最新资讯28at.com

流程解读

客户端-登录界面(通常手机验证码登录)

  • 填写手机号
  • 发送验证码
  • 填写验证码
  • 勾选新用户自动注册

服务端-用户验证

  • 验证账号验证码是否正确
  • 验证用户是否存在(不存在出初始化用户信息)
  • 完成验证生成 token
  • 将 token 返回给客户端

用户信息设计:

图片图片GUh28资讯网——每日最新资讯28at.com

验证流程图解

图片图片GUh28资讯网——每日最新资讯28at.com

登录验证流程涉及到了两个接口,两个缓存:GUh28资讯网——每日最新资讯28at.com

  • 获取验证码接口,给手机号发送验证码并设置验证码缓存,设置过期时间。
  • 登录接口,提交手机号及验证码,读取缓存进行匹配验证,成功则生成 token 返回给客户端,客户端登录成功,登录后请求头携带 token 进行业务请求即可。

关于 token 过期时间

通常我们 token 的过期时间是根据客户端的类型来定义的,app 的过期时间会更长一些(通常一个星期)。GUh28资讯网——每日最新资讯28at.com

web 端过期时间以小时为单位,如果控制过期时间可以将 web 登录和 app 登录拆分为两个接口(能够分流,接口压力更小),或者是根据请求头信息进行判断即可,是移动端就设置 7 天,是 web 端就设置两小时。GUh28资讯网——每日最新资讯28at.com

关于业务请求 token 验证

登录成功后,客户端每次请求都会携带 token,通常我们会有一个网关来进行 token 验证,网关用于登录验证的核心就是登录成功后写入的 token 作为 key,值为用户基础信息的缓存。GUh28资讯网——每日最新资讯28at.com

图解如下:GUh28资讯网——每日最新资讯28at.com

图片图片GUh28资讯网——每日最新资讯28at.com

验证成功后,重写内部请求头,将用户的的 id,账号,昵称信息放入请求头中,这样可以方便业务系统获取当前操作用户信息以及权限控制等等。GUh28资讯网——每日最新资讯28at.com

关于登出操作

用户携带 token 请求登出接口,登出接口对 token 对应的缓存进行删除操作,返回 401 即可,客户端获取到 401 就会跳转到登录页面。GUh28资讯网——每日最新资讯28at.com

关于匿名请求(免登录)

通常匿名请求放行有两种方案:GUh28资讯网——每日最新资讯28at.com

  • 授权 token,为 token 设置单位时间内请求次数
  • 配置路径放行规则,对请求接口路径进行正则匹配,符合正则规则的进行放行

方案 1:授权 token,限制单位时间请求次数

优点就是虽然是免登录接口,但是接口的操作对象可以追溯,请求次数可控,避免被非法利用;缺点就是需要更多的编码及配置工作。GUh28资讯网——每日最新资讯28at.com

技术实现:GUh28资讯网——每日最新资讯28at.com

  • 提供一个授权 token 管理页面,主要管理 token 使用者,token 的值,单位时间访问次数(如每分钟 60 次)
  • 增删改查,将授权 token 存放到缓存中,使用 map 进行存储,key 为 token,值为每分钟访问次数
  • 单位时间计数缓存,过期时间为 1 分钟

这时候我们需要在上面的验证流程图基础上进行升级:GUh28资讯网——每日最新资讯28at.com

图片图片GUh28资讯网——每日最新资讯28at.com

请求次数检查代码实现:import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/** * 授权token请求限制缓存 */@Componentpublic class AuthTokenRequestLimitCache {    @Autowired    private RedisTemplate<String, Integer> redisTemplate;    private static final String AUTH_TOKEN_LIMIT_KEY_PREFIX = "auth_token_limit";    /**     * 请求次数+1并检查是否超限     *     * @param token     * @return 是否放行      */    public boolean incrementWithCheck(String token) {        // 1.获取token请求次数限制,获取为null代表授权配置已被修改,此token已经不具备权限        Integer limit = getLimit(token);        if (limit == null) {            return false;        }        // 2.组装缓存key,读取缓存        String key = String.join(":", AUTH_TOKEN_LIMIT_KEY_PREFIX, token);        Integer count = redisTemplate.opsForValue().get(key);        // 3.没有值代表一分钟内没有请求产生了        if (count == null) {            // 初始化值            redisTemplate.opsForValue().increment(key);            // 设置过期时间            redisTemplate.expire(key, 1L, TimeUnit.MINUTES);            return true;        }        // 自增并获取当前值 大于限制的话 返回false 网关过滤器返回提示信息(如请求过于频繁)        Long inc = redisTemplate.opsForValue().increment(key);        return inc <= limit;    }    /**     * 获取限值     *     * @param token     * @return     */    public Integer getLimit(String token) {        Object limit = redisTemplate.opsForHash().get("auth_token_limit", token);        return limit == null ? null : (Integer) limit;    }}

对于授权接口,通常是只允许 get 操作,对数据进行提交或者更新是不被允许的,当然这个是业务层面的,最终取决于系统设计。GUh28资讯网——每日最新资讯28at.com

方案 2:请求路径正则校验

我们在网关的配置文件中增加匿名接口规则,请求到网关时,检查请求的路径是否符合匿名接口规则,是则放行,不是则进行 token 校验,方案比较简单,只需要对网关进行处理即可。GUh28资讯网——每日最新资讯28at.com

关于黑名单

对于一个系统来说,黑名单是最后一道关卡,所以为了安全我们需要对问题用户进行黑名单操作。GUh28资讯网——每日最新资讯28at.com

具体实现也比较简单:GUh28资讯网——每日最新资讯28at.com

  • 用户管理页面提供一个拉黑的按钮,拉黑后,这些用户的 id 会存储到一个 set 集合中去
  • 登录时候检查用户是否在黑名单中,是则拒绝登录并提示
  • 如果用户已经登录后进行拉黑操作,网关会在鉴权通过后检查用户是否在黑名单中,是则删除 token 对应缓存,返回 401,401 就会跳到登录页,步骤 2 就会进行拦截

总结

用户系统是非常基础的系统,但是很多程序员工作中可能并没有真正的参与到用户系统的开发,通过此文可以对用户登录流程及配套功能有一个全面的了解。GUh28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96762-0.html三年探索,登录注册之路仍漫漫

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 2024 最新最全 VS Code 插件推荐!

下一篇: CSS的媒体查询:响应式布局的利器

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top