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

SpringCloud微服务中如何实现多端认证?

来源: 责编: 时间:2024-03-18 09:34:36 252观看
导读概述DailyMart是一个ToC的在线购物商城,目前仅支持通过浏览器访问。在商城中的所有操作都需要用户先登录。为了实现这一需求,我们可以采用以下技术方案:用户通过SpringCloud Gateway访问CustomerService进行登录认证。认

概述

DailyMart是一个ToC的在线购物商城,目前仅支持通过浏览器访问。在商城中的所有操作都需要用户先登录。为了实现这一需求,我们可以采用以下技术方案:m8a28资讯网——每日最新资讯28at.com

  1. 用户通过SpringCloud Gateway访问CustomerService进行登录认证。认证成功后,服务器返回一个JWT(JSON Web Token)。在接下来的操作中,用户需要在请求头中携带此Token。
  2. 在网关服务中,我们创建了一个名为ApiAuthenticatorFilter的过滤器。该过滤器用于验证请求头中是否包含Token,并检查Token的有效性。如果请求头中没有携带Token,或者Token失效,则不允许访问后端接口。

详细交互流程如下图1所示:m8a28资讯网——每日最新资讯28at.com

图1:PC认证流程图1:PC认证流程m8a28资讯网——每日最新资讯28at.com

多端认证需求

这种架构在初期可以满足业务的发展需求。然而,随着业务的扩展,我们需要考虑到现在大部分用户使用手机进行购物的情况。因此,DailyMart也需要支持手机端访问。但与浏览器不同,手机端的认证机制可能会有所不同。m8a28资讯网——每日最新资讯28at.com

例如,浏览器端的Token有效期通常设定为1小时,而手机端的Token有效期通常设置为7天或更长。此外,浏览器端的Token采用JWT这种去中心化的认证机制,而手机端的Token采用中心化的认证机制,需要调用手机端服务进行登录认证。m8a28资讯网——每日最新资讯28at.com

同时,为了扩展业务,其他一些第三方应用可能也需要调用DailyMart的后端服务来获取数据,对于第三方的应用一般采用appId + appSecret的方式进行认证,同时需要对接口参数进行签名防止出现篡改和重放。(此方案在前文中有详细说明,可以通过链接跳转访问查看。)m8a28资讯网——每日最新资讯28at.com

现在的问题是,如何在原有架构的基础上满足这三种不同形式的认证需求呢?m8a28资讯网——每日最新资讯28at.com

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

解决方案

要解决这个问题,最关键在于如何判断请求的来源,是来自浏览器端的请求、手机端的请求还是第三方的请求?m8a28资讯网——每日最新资讯28at.com

我们可以通过请求路径进行区分,对于不同端的请求使用不同的路径进行标识,可以做如下约定:m8a28资讯网——每日最新资讯28at.com

  • 手机端请求,需要在请求路径上带有/ph/
  • 浏览器请求,需要在请求路径上带有/pd/
  • 第三方请求,需要在路径请求上带有/pt/
  • ...

最终规定接口的完整请求路径为:/服务名/api/来源标识/接口路径/,如:http://localhost:9090/customer-service/api/pd/customer/infom8a28资讯网——每日最新资讯28at.com

这样在SpringCloud Gateway网关先获取请求的路径,再根据请求的路径判断请求来源,最后根据请求来源实现不同的认证方案。m8a28资讯网——每日最新资讯28at.com

解决这个问题的关键在于如何判断请求的来源,即是来自浏览器端、手机端还是第三方应用?m8a28资讯网——每日最新资讯28at.com

我们可以通过请求路径进行区分,对于不同端的请求使用不同的路径进行标识。例如:m8a28资讯网——每日最新资讯28at.com

  • 手机端请求,在请求路径上带有 /ph/
  • 浏览器端请求,在请求路径上带有 /pd/
  • 第三方请求,在请求路径上带有 /pt/
  • ...

最终,我们规定接口的完整请求路径为:/服务名/api/来源标识/接口路径/,例如:http://localhost:9090/customer-service/api/pd/customer/infom8a28资讯网——每日最新资讯28at.com

这样,在SpringCloud Gateway网关中,我们需要创建一个过滤器,首先获取请求的路径,然后根据请求的路径判断请求来源,最后根据请求来源实现不同的认证方案。m8a28资讯网——每日最新资讯28at.com

代码实现

有了解决方案,我们就很容易完成代码实现了。m8a28资讯网——每日最新资讯28at.com

为了满足多端认证的需求,在网关服务中我们可以抽取一个公共的认证接口ApiAuthenticator,具体的认证逻辑由具体实现类实现。m8a28资讯网——每日最新资讯28at.com

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

在上面的类图中,ProtectedApiAuthenticator用于实现第三方的认证逻辑,DefaultApiAuthenticator用于实现浏览器端的认证逻辑。m8a28资讯网——每日最新资讯28at.com

在网关过滤器ApiAuthenticatorFilter中,我们首先根据请求路径获取请求来源,然后根据请求来源找到对应的实现类。m8a28资讯网——每日最新资讯28at.com

@Component@Slf4jpublic class ApiAuthenticatorFilter implements GlobalFilter, Ordered {        @Override    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {        URI uri = exchange.getRequest().getURI();        String rawPath = uri.getRawPath();        // 静态接口直接过滤        if (handleExcludeUrl(rawPath)) {            return chain.filter(exchange);        }              // 获取认证逻辑        ApiAuthenticator apiAuthenticator = getApiAuthenticator(rawPath);        AuthenticatorResult authenticatorResult = apiAuthenticator.auth(exchange);                if (!authenticatorResult.isResult()) {            return Mono.error(new HttpServerErrorException(                    HttpStatus.METHOD_NOT_ALLOWED, authenticatorResult.getMessage()));        }                return chain.filter(exchange);            }                /**     * 确定认证策略     * @param rawPath 请求路径     */    private ApiAuthenticator getApiAuthenticator(String rawPath) {        String[] parts = rawPath.split("/");        if (parts.length >= 4) {            String parameter = parts[3];            return switch (parameter) {                case PROTECT_PATH -> new ProtectedApiAuthenticator();                case PRIVATE_PATH -> new PrivateApiAuthenticator();                case PUBLIC_PATH -> new PublicApiAuthenticator();                case DEFAULT_PATH -> new DefaultApiAuthenticator();                default -> throw new IllegalStateException("Unexpected value: " + parameter);            };        }        return new DefaultApiAuthenticator();    } }

以下是浏览器端的认证逻辑,它会验证JWT token的有效性。如果token失效,则直接返回错误提示给用户,引导其重新登录。m8a28资讯网——每日最新资讯28at.com

@Component@Slf4jpublic class DefaultApiAuthenticator implements ApiAuthenticator {        @Override    public AuthenticatorResult auth(ServerWebExchange exchange) {        ServerHttpRequest request = exchange.getRequest();        HttpHeaders httpHeaders = request.getHeaders();                // 获取JWT请求头 Authorization        String token = httpHeaders.getFirst(HttpHeaders.AUTHORIZATION);                if (Objects.nonNull(token)) {            try {                String subjectFromJWT = JwtUtil.getSubjectFromJWT(token);                log.info("用户请求token: {} , 身份Subject:{}", token, subjectFromJWT);                //重新设置请求头                mutateNewHeader(exchange, subjectFromJWT);                return new AuthenticatorResult(true, "认证通过");            } catch (ParseException | JOSEException e) {                log.error("token解析失败");                return new AuthenticatorResult(false, "Token错误,请重新登录!");            }                    }                return new AuthenticatorResult(false, "Token为空,请重新登录!");    }}

小结

本文提出了一种灵活、可扩展的方案,以满足 DailyMart 在业务发展过程中的多端认证需求。通过使用请求路径区分不同端的请求来源,并在 SpringCloud Gateway 网关中实现相应的过滤器进行认证,方案具有灵活性、可扩展性和可维护性。m8a28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-76482-0.htmlSpringCloud微服务中如何实现多端认证?

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

上一篇: 终于明白为啥面试老是有人问 SubList 了,原来这玩意会 OOM!

下一篇: 写了个简单爬虫,收集 Boss直聘自动驾驶岗位

标签:
  • 热门焦点
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
Top