2、网关统一认证 + 服务内部鉴权

用 oauth2_proxy + GitHub 实现 Kubernetes 服务统一身份认证 OAuth2 是现代 Web 应用实现安全身份认证的核心协议,其授权码模式通过第三方身份提供商(IdP)完成用户鉴权与信息透传。oauth2_proxy 作为专为 Kubernetes 设计的轻量级反向代理网关,深度集成 GitHub 等主流 IdP,将 OAuth2 流程封装为标准 HTTP 头(如 X-Forwarded-User),无缝对接 Grafana、Argo CD 等内部服务。该方案避免修改业务代码,复用开发者已有 GitHub 身份,天然支持组织级授权与审计日志,显著降低 Keycloak/ 阅读详情

这是一个非常好的问题,它触及了微服务架构设计的核心挑战之一。对于Spring Cloud电商项目,用户认证与鉴权的处理方式直接影响到系统的安全性、复杂度和可维护性。

我会从理论推荐、实际项目做法以及具体实现三个层面来为你详细解答。

一、理论推荐:网关统一认证 + 服务内部鉴权

这是目前最主流、最被推荐的架构模式。其核心思想是:将身份认证(Authentication)这个动作与业务逻辑解耦,在API网关层统一处理;而将权限鉴定(Authorization)下放到各个微服务,由它们根据自身业务需求灵活处理。

1. 认证 (Authentication) - 放在API网关

为什么放在网关?

  • 单一职责与关注点分离:认证是一个横切关注点,几乎所有请求都需要。如果每个微服务都自己实现一遍认证,会造成大量的代码冗余和维护负担。网关作为所有外部流量的入口,是处理这类跨领域问题的理想场所。
  • 安全边界:网关是系统的“门卫”,它将不可信的外部请求转换为内部可信的请求。一旦在网关认证通过,该请求就可以被信任地在内部服务间传递,内部服务无需再次验证用户身份的真伪(但需要验证权限)。
  • 性能:避免在每个服务中重复进行令牌解析、校验等操作,减少网络开销(如每次校验都调用认证服务)。网关校验一次后,可以将用户信息(如UserID、角色等)直接传递给下游服务。
  • 易于管理:证书、密钥等敏感信息可以集中管理在网关层,降低了泄露风险。

网关的工作流程:

  1. 拦截所有进入的HTTP请求。
  2. 检查请求中是否携带Token(通常是JWT,放在Authorization header中)。
  3. 校验Token的有效性(签名是否正确、是否过期等)。
  4. 如果Token无效或缺失,直接返回401 Unauthorized错误,请求不会进入下游微服务。
  5. 如果Token有效,解析出其中的用户信息(如用户ID、用户名、角色列表等)。
  6. 将解析出的用户信息以HTTP Header的形式(例如X-User-Id, X-User-Roles)添加到请求中,然后将请求转发给下游的微服务。
2. 鉴权 (Authorization) - 放在各个微服务

为什么下放到微服务?

  • 业务相关性:权限鉴定通常与具体业务紧密相关。例如:
    • 订单服务:需要鉴定用户是否有权限查询某个订单(“这个订单是不是你的?”)。
    • 商品管理服务:需要鉴定用户角色是否是“管理员”才有权上下架商品。
    • 优惠券服务:需要鉴定用户是否满足领取某种优惠券的条件。
  • 灵活性:每个微服务对自己的资源拥有最完整的上下文信息,可以做出最精确的权限判断。如果将所有鉴权逻辑都集中到网关,网关会变得异常臃肿且难以维护。

微服务的工作流程:

  1. 接收从网关转发过来的请求,请求头中已包含用户身份信息。
  2. 从请求头中提取用户信息(如UserID、角色)。
  3. 根据当前请求的资源和要执行的操作,结合用户信息,执行鉴权逻辑。
    • 简单场景:使用Spring Security的@PreAuthorize("hasRole('ADMIN')")或@PreAuthorize("#userId == principal.username")等注解。
    • 复杂场景:在Service方法中编写自定义逻辑,例如查询数据库,判断当前用户是否是某个资源的所有者。
  4. 如果鉴权通过,正常处理业务;如果不通过,抛出异常(如AccessDeniedException),返回403 Forbidden错误。

二、真实的实际项目开发中的处理方式

在实际项目中,理论会结合一些具体的技术栈和优化策略。

1. 技术栈选型
  • API网关:Spring Cloud Gateway(主流推荐)或 Netflix Zuul。
  • 认证方式:JWT (JSON Web Token) 是绝对的主流。因为它自包含、无状态,非常适合分布式场景,无需在服务端存储会话。
  • 鉴权框架:Spring Security + OAuth2.0资源服务器模式。Spring Security提供了强大且灵活的安全能力,OAuth2.0是现代API安全的工业标准。
2. 具体实现细节(以Spring Cloud Gateway + JWT + Spring Security为例)

步骤一:网关统一认证
在Spring Cloud Gateway中,通过实现一个GlobalFilter来拦截和校验Token。

@Component
public class AuthenticationFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = extractToken(exchange.getRequest());
        
        if (token == null) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        try {
            // 使用JWT工具类校验并解析Token
            Claims claims = JwtUtils.parseToken(token); 
            String userId = claims.getSubject();
            String roles = claims.get("roles", String.class);
            
            // 将用户信息添加到请求Header,转发给下游服务
            ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()
                    .header("X-User-Id", userId)
                    .header("X-User-Roles", roles)
                    .build();
            
            return chain.filter(exchange.mutate().request(mutatedRequest).build());
            
        } catch (Exception e) {
            // Token无效或过期
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
    
    private String extractToken(ServerHttpRequest request) {
        // 从Authorization头提取Token
        List<String> headers = request.getHeaders().get("Authorization");
        if (headers == null || headers.isEmpty()) {
            return null;
        }
        String header = headers.get(0);
        if (header.startsWith("Bearer ")) {
            return header.substring(7);
        }
        return null;
    }
}

步骤二:微服务内部鉴权
在订单服务、用户服务等业务微服务中配置Spring Security。

# application.yml
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://auth-server # 配置JWT签发者,用于验签
@Configuration
@EnableWebSecurity
@EnableMethodSecurity // 启用方法级安全注解
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/api/orders/**").authenticated() // 需要认证
                .anyRequest().permitAll()
            )
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); // 配置为JWT资源服务器
        return http.build();
    }
}

在Service或Controller层使用注解进行鉴权:

@RestController
@RequestMapping("/api/orders")
public class OrderController {

    @GetMapping("/{orderId}")
    // 方法一:使用SpEL表达式,要求当前认证主体的用户名等于订单资源中的ownerId字段
    @PreAuthorize("@orderService.canAccess(#orderId, principal.claims['userId'])")
    // 方法二:简单角色校验
    // @PreAuthorize("hasAuthority('ROLE_USER')")
    public Order getOrder(@PathVariable String orderId) {
        // ... 业务逻辑
    }
}

@Service
public class OrderService {
    // 供@PreAuthorize调用的鉴权方法
    public boolean canAccess(String orderId, String userId) {
        Order order = findOrderById(orderId);
        return order != null && order.getUserId().equals(userId);
    }
}

三、总结与关键要点

处理环节推荐位置核心技术职责
认证 (Authentication)API 网关JWT, Spring Cloud Gateway Filter校验Token真伪,确认用户身份
鉴权 (Authorization)各个微服务Spring Security @PreAuthorize, 自定义逻辑校验用户是否有权限执行操作

真实项目中的额外考量:

  1. Token如何下发? 会有一个独立的认证服务(Auth Service) 专门负责登录(/oauth/token)和注册。它负责生成JWT。这个服务不处理业务,只负责“发身份证”。
  2. 内部服务调用(Feign)如何传递身份? 需要使用Feign拦截器,自动将当前请求的用户信息(来自网关添加的Header)再传递给下一个服务。
    @Bean
    public FeignRequestInterceptor feignRequestInterceptor() {
        return template -> {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes != null) {
                HttpServletRequest request = attributes.getRequest();
                String userId = request.getHeader("X-User-Id");
                template.header("X-User-Id", userId);
            }
        };
    }
    
  3. 黑名单/令牌注销:JWT的无状态性是优点也是缺点。如果需要实现“立即下线”功能,需要在网关或认证服务维护一个令牌黑名单,或者采用短期JWT配合刷新令牌(Refresh Token)的策略。
  4. 监控与日志:在网关层记录所有认证失败和成功的行为,便于安全审计。

总而言之,“网关认证,服务鉴权” 是经过大量实践检验的、平衡了安全、性能和复杂度的最佳方案,也是你在开发Spring Cloud电商项目时应该首先考虑的架构设计。

SpringCloudGateway+JWT统一认证鉴权 参考springcloud-learning/micro-oauth2 阅读详情

相关推荐

SpringCloud微服务整合Spring Security进行统一鉴权

有一个大坑,记得如果是单机操作多个微服务项目,要给每个微服务添加session cookie name,如下server : port : 8003 servlet : session : cookie : #防止 Cookie 冲突,冲突会导致登录验证不通过一定一定要做这一步。

lyy的博客 4646

Java鉴权机制全解析:从Session到JWT与Spring Security实战

鉴权是系统安全的核心机制,涉及认证与授权两大基础概念。认证解决身份真伪问题,授权则确定权限范围。其技术原理从传统的Session状态保持演进到无状态的Token机制,以平衡安全性、扩展性与用户体验。在Java生态中,Spring Security作为一站式安全框架,通过过滤器链和RBAC模型提供了强大的权限控制能力。结合JWT实现无状态分布式鉴权,能够有效支撑微服务架构下的安全需求。本文聚焦JWT、Spring Security等热词,深入探讨其在API防护、用户身份管理中的应用场景与工程实践,为构建健壮的

hideto 553

如何使用安路TD与Modelsim进行联合仿真?

1)安装安路FPGA开发软件;(本次实验使用版本:TD_5.6.3_Release)2)安装Modelsim仿真软件;(本次实验使用版本:Modelsim SE-64 10.1c)3)FPGA开发板;(本次实验使用型号:EG4X20BG256)4)LED点灯例程;

qq_17313923的博客 3212

微服务 - 网关统一鉴权

网关统一鉴权,顾名思义,就是将原本分散在各个微服务中的身份验证和权限校验逻辑,抽取出来并集中到API网关这一层来统一处理。传统方式(无网关): 每个微服务(如用户服务、订单服务、支付服务)都需要自己实现一套鉴权逻辑,检查Token是否有效、用户是否有权限访问等。这会导致以下一系列问题:代码重复与维护困难:每个服务都需要编写和维护相似的鉴权代码,违反了“Don‘t Repeat Yourself”原则。标准不一:不同的开发团队可能实现不同的鉴权逻辑或安全标准,导致系统整体安全性不一致。

qq_33807380的博客 1224

JS实例(三)图片的缓慢放大和缩小

  我们经常能看到在一些网站中可以通过按钮实现对图片的放大或者缩小,也有可能是鼠标经过时图片放大。在本例中就是通过JavaScript实现图片的放大和缩小。   首先是进行简单的页面布局 1 <div class="imagedispose"> 2 <img src="1.jpeg" id="imaged" width="400px" height="3...

weixin_34235105的博客 312

中国30米分辨率城市建成区数据集 (1972-2023年)

全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。

地球资源数据云的官方博客 5824

微服务中的鉴权该怎么做?

最近刚好有小伙伴在微信上问到这个问题,松哥就来和大家聊一聊,本文主要和小伙伴们聊一聊思路,不写代码,小伙伴们可以结合松哥之前的文章,应该能够自己写出来本文的代码。当然,思路也只是我自己的一点实践经验,不一定是最完美的方案,欢迎小伙伴们在留言中一起探讨。首先小伙伴们知道,无论我们学习 Shiro 还是 Spring Security,里边的功能无论有哪些,核心都是两个:所以,我们在微服务中处理鉴权问题,也可以从这两个方面来考虑。认证,说白了就是登录。传统的 Web 登录是 Cookie+Session 的方案

BASK2311的博客 2565

多智能体强化学习之值函数分解:VDN、QMIX、QTRAN系列优缺点分析(转载)

关于多智能体强化学习中VDN,QMIX,QTRAN三个算法再值分解方向的研究成果。三个算法呈递进关系

qq_33328642的博客 5857

spring cloud gateway 之 内部鉴权

关于spring cloud gateway 的routes的方式使用本文不再涉及,可以百度查到很多资料,这里主要说spring cloud gateway网关服务内部的接口鉴权方式 由于很多原因,不得不将一些访问量很低,性能优异的接口写在网关内部,这其实是不好的做法,但是有的时候相比其他做法却又是最佳的,此时我们会面临一个问题,那就是这些接口如何鉴权的问题,这里比较麻烦,可能多数小伙伴对webflux 了解不多,我也是,因此花了很多时间,走了很多冤枉路,最后感谢大佬的帮助才得以了解这个关键字以此来.

ahty的专栏 4659

基于深度残差U-Net与多尺度注意力机制的医学图像分割系统

本文提出了一种创新的医学图像分割系统,通过融合残差连接、通道注意力机制和空间金字塔池化技术,构建了高性能的UResnet分割网络。系统采用编码器-解码器架构,创新性地引入多层次特征增强模块,显著提升了医学图像中复杂组织结构的分割精度。实验结果表明,该方案在多个医学图像数据集上均取得了优异性能,边界分割精度提升15%,训练收敛速度提升30%,同时减少20%计算量。系统为临床诊断提供了可靠的技术支持,未来可扩展至3D医学图像分割和联邦学习等方向。

Henry的博客 813

多 Agent 之间如何通信和协调?OpenClaw 的 Gateway 在其中扮演什么角色?

多 Agent 之间如何通信和协调?OpenClaw 的 Gateway 在其中扮演什么角色?

我哎GIS博客 1664

JWT对SpringCloud进行系统认证和服务鉴权

JWT对SpringCloud进行系统认证和服务鉴权一、为什么要使用jwt?在微服务架构下的服务基本都是无状态的,传统的使用session的方式不再适用,如果使用的话需要做同步session机制,所以产生了了一些技术来对微服务架构进行保护,例如常用的鉴权框架Spring Security OAuth2和用Jwt来进行保护,相对于框架而言,jwt较轻,且可以自包含一些用户信息和设置过期时间,省去了S...

三分之一程序员 2万+

CloudCompare 二次开发(35)——提取多条直线

使用CloudCompare与PCL编程实现的多条空间直线的提取。

点云侠的博客 436

4种常见的鉴权方式及说明

一、什么是鉴权 鉴权(authentication)是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份...

sinat_33255495的博客 5万+

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事?

Panel 中控件的图像随着值变化,是怎么回事?

蚂蚁小兵 2144

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring Cloud Gateway实现网关统一鉴权,网关统一Token认证

需求背景 在微服务的场景下,采用了Spring Cloud Oauth2进行token的管理,实现认证和授权,在这下背景下,有两种解决方案: 网关统一鉴权 此模式适用于网关下的所有模式都是通过一种模式进行鉴权操作,可以统一管理 微服务模块各自鉴权 此模式适用于网关下的各个模块有不同的鉴权模式,针对不同的业务场景需要满足不同的实现,如采用oauth2、shiro、签名等方式。 下文就网关统一鉴权的实现方式提供解决方案,以供参考 实现方案 通过过滤器的方式实现统一拦截,下面以核心代码的方式展示,具体所有代码可以

bufegar0的博客 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权!

最近发现了一个很好的微服务权限解决方案,可以通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权。此方案为目前最新方案,仅支持Spring Boot 2.2.0、Spring Cl...

macrozheng的专栏 4万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

微服务权限解决方案,Cloud Gateway+Oauth2实现统一认证和鉴权

最近发现了一个很好的微服务权限解决方案,可以通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权。此方案为目前最新方案,仅支持Spring Boot 2.2.0、Spring Cloud Hoxton 以上版本,本文将详细介绍该方案的实现,希望对大家有所帮助! 前置知识 我们将采用Nacos作为注册中心,Gateway作为网关,使用nimbus-jose-jwtJWT库操作JWT令牌 应用架构 我们理想的解决方案应该是这样的,认证服务负责认证,网关负责校验认证和鉴权,其他API服务负.

一入Java深似海 2万+

「springcloud 2021 系列」Spring Cloud Gateway + OAuth2 + JWT 实现统一认证与鉴权

通过认证服务进行统一认证,然后通过网关来统一校验认证和鉴权。 将采用 Nacos 作为注册中心,Gateway 作为网关,使用 nimbus-jose-jwt JWT 库操作 JWT 令牌 理论介绍 Spring Security 是强大的且容易定制的,基于 Spring 开发的实现认证登录与资源授权的应用安全框架 SpringSecurity 的核心功能: Authentication:身份认证,用户登陆的验证(解决你是谁的问题) Authorization:访问授权,授权系统资源的访问权限(解

郎涯技术 1万+

微服务网关鉴权——gateway使用、网关限流使用、用户密码加密、JWT鉴权

第3章 微服务网关鉴权 课程目标 掌握微服务网关Gateway的系统搭建 掌握网关限流的实现 能够使用BCrypt实现对密码的加密与验证 了解加密算法 能够使用JWT实现微服务鉴权 1.微服务网关Gateway 1.1 微服务网关概述 ​ 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端...

zzhou——blog 1万+

Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现统一认证授权和网关鉴权

本篇基于 Spring Cloud & Alibaba + OAuth2 微服务技术栈实现认证服务器认证授权和网关(代理资源服务器)统一鉴权的总结文档。

有来技术 7617

Spring Cloud Gateway+Oauth2 实现统一认证和鉴权

前言 应用架构: 认证服务负责认证,网关负责校验认证和鉴权,其他API服务负责处理自己的业务逻辑。 安全相关的逻辑只存在于认证服务和网关服务中,其他服务只是单纯地提供服务而没有任何安全相关逻辑。 JWT认证流程: 1、用户使用账号和密码发出post请求; 2、服务器使用私钥创建一个jwt; 3、服务器返回这个jwt给浏览器; 4、浏览器将该jwt串在请求头中像服务器发送请求; 5、服务器验证该jwt; 6、返回响应的资源给浏览器。 JWT解析 JWT使用场景: 授权:这是JWT使用最多的场景,一旦用户登

const_ 8949

SpringCloud认证和鉴权的6种方案

认证和鉴权 SpringCloud认证和鉴权方案 开始我们接触的时候权限认证 无从下手,但是当接触之后会发现 权限认证时一件很简单的事情,但是我们 方案众多又该如何选择呢,下面会分别对每种方案进行简单的阐述,有问题或者不明白的可以私信或者下方留言,一起讨论 含义 认证:简单来说,认证这个用户是谁。 鉴权:简单来说,就是了解这个用户能做什么事情 本篇章介绍如下几种方式 1.单体应用...

十年呵护的专栏 4万+

微服务常见认证、鉴权方案

参考网上一些优秀开源项目和框架,谈谈常见的微服务认证、鉴权方案。内容有SecurityOauth2、单点登录cas、自定义拦截器开发、微服务间鉴权、令牌的存储方式、shiro由单体改动为微服务 微服务认证、鉴权的目标: 一次登录后,各微服务都能访问 可对各微服务进行角色、接口等粒度的鉴权 SecurityOauth2 可能是seurity框架提供了一个微服务鉴权的直接解决方式,导致网上资料大部分都是此类方案。 这个方案理解起来并不难。 首先,在登录时,利用oauth2协议的四种方式及自定义.

u014203449的博客 1万+

最新版微服务架构鉴权解决方案Spring Cloud Gateway + Oauth2.0+mybatis+mysql+redis+nacos 统一认证和鉴权

环境列表 网关服务。以springboot+springcloud+gateway 实现的网关服务。 Nacos server注册中心。本地或云上的Nacos server。 普通微服务: user-service。需要将user-service注册到Nacos。 Auth2 server 授权服务器。 需要将Auth2 server注册到Nacos。 资源服务器。 将user-service 配置成资源服务器。Oauth2.0原理简介 授权服务器: 给具有权限的资源拥有者对

Dream_it_possible!的博客 1万+

微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims。创建测试类,并设置测试方法:@Test//当前时间.setId("888") //设置唯一编号.setSubject("小白")//设置主题 可以是JSON数据.setIssuedAt(new Date())//设置签发日期.setExpiration(date)//设置过期时间.claim("roles","admin")//设置角色。

u011347171的博客 2900
上一篇: 1、电商微服务命名示例(按模块分类)
下一篇: 3、用户认证与鉴权应该放在哪里进行?
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值