GeoServer HTTP Header认证配置指南:安全集成与Postman测试

1. 项目概述:为什么你的GeoServer需要HTTP Header认证?

如果你正在用GeoServer发布地图服务,无论是内部业务系统调用,还是对外提供公开的WMS/WFS服务,安全都是绕不开的话题。默认安装的GeoServer,其基于表单的用户名密码认证,在API调用场景下显得笨重且不安全。想象一下,你的前端应用每次请求地图切片,都需要携带一个可能过期的Cookie或Session,这不仅增加了客户端的复杂性,也容易在传输过程中暴露凭据。更常见的情况是,你需要将地图服务集成到另一个已有认证体系的后端服务中,比如一个微服务架构的应用,这时你希望认证逻辑在网关层统一处理,下游的GeoServer只需信任来自网关的请求即可。

这就是HTTP Header认证的价值所在。它本质上是一种“信任传递”机制。认证的校验工作被前置到了GeoServer前方的代理服务器(如Nginx、Apache)或API网关上。这些前置服务在验证了原始请求的合法性(例如,通过JWT、API Key或OAuth2.0)后,会在转发给GeoServer的请求头(Header)里,添加一个包含已验证用户信息的字段(如 X-Forwarded-User )。GeoServer则配置为信任这个特定的Header,并从中提取用户名,进而根据自身的角色权限配置,决定该请求是否有权访问特定图层或服务。

我接手过不少项目,初期为了快速上线,直接开放了GeoServer的匿名访问,结果没多久就发现地图服务被恶意爬取,甚至有人尝试上传恶意SLD样式文件。事后加固,将认证方式切换到HTTP Header后,整个系统的安全边界清晰了很多,前端代码也简洁了,后端服务间的调用也变得纯粹。这次,我就把从架构设计、具体配置到用Postman模拟测试的完整流程和踩过的坑,给你彻底讲明白。

2. 核心架构与安全模型设计

在动手改配置之前,我们必须先理清整个安全链条是如何运作的。盲目开启一个功能而不理解其背后的信任模型,是系统安全的大忌。

2.1 信任边界转移:从GeoServer到反向代理

在传统GeoServer表单认证模式下,GeoServer自身就是信任边界。它直接处理用户的登录凭证,维护会话。而在HTTP Header认证模式下,这个信任边界被向前推移到了反向代理或网关。GeoServer会无条件地信任来自特定网络位置(通常是本地回环地址 127.0.0.1 或内部网络段)且携带了特定Header的请求。

注意:这是一个关键的安全假设 。你必须确保GeoServer本身 不能 被外部网络直接访问。所有外部请求必须、且只能通过你配置的那个可信的反向代理进来。如果GeoServer的8080端口暴露在了公网,那么攻击者完全可以伪造任何HTTP Header直接访问,你的认证体系就形同虚设。

因此,标准的部署拓扑应该是: 客户端 -> (互联网) -> 反向代理/Nginx(部署SSL、进行主认证) -> (内网) -> GeoServer(信任来自Nginx的Header) 。Nginx和GeoServer之间最好通过内网通信,甚至部署在同一台主机上使用 localhost 通信。

2.2 Header的选择与安全考量

用什么Header来传递用户名,没有强制标准,但有一些最佳实践。常见的选择有:

  • X-Forwarded-User : 最常用、语义最清晰的Header,广泛被各种代理软件支持。
  • Remote-User : 源于Apache的 mod_auth 模块,也是一个标准做法。
  • 自定义Header :例如 X-API-User 。使用自定义Header可以稍微增加一点攻击者的猜测成本,但本质上安全性并不比标准Header高,因为安全不依赖于隐蔽。

我个人的建议是使用 X-Forwarded-User ,因为它的通用性最好,文档和社区支持最丰富。Header的值应该直接是用户的唯一标识,通常是用户名(Username)。例如: X-Forwarded-User: zhangsan

这里有一个至关重要的细节: GeoServer的HTTP Header认证模块,默认是大小写敏感的 。这意味着,如果你在Nginx里设置的是 X-Forwarded-User ,在GeoServer配置里也必须一字不差地写成 X-Forwarded-User ,写成 x-forwarded-user 会导致认证失败。这是我早期踩过的一个坑,排查了半天才发现是大小写问题。

2.3 角色与权限的映射

拿到了用户名只是第一步。这个用户能在GeoServer里做什么,取决于GeoServer内部如何给这个用户分配角色(Role)。这里有几种映射策略:

  1. 一对一静态映射 :在反向代理层进行主认证时,你不仅知道用户是谁,还知道他的角色(例如,来自JWT的 roles 声明)。你可以在代理层将角色列表也通过一个Header(如 X-Forwarded-Roles )传给GeoServer。然后,需要在GeoServer里为每个可能出现的角色提前创建好同名角色,并配置权限。这种方式灵活但配置稍复杂。
  2. 代理用户映射 :更常见的简化模式是,在GeoServer中创建一个专门的用户,例如叫 proxy_user ,并赋予它管理员或某个高级角色。然后,配置HTTP Header认证模块,将所有通过Header认证进来的请求,都映射为这个 proxy_user 。这样做,权限管理完全在GeoServer内部,代理层只负责“放行可信请求”。这种方式简单粗暴,适用于所有通过代理进来的请求享有相同权限的场景。
  3. 动态角色Header :结合上述两者,配置GeoServer同时识别 X-Forwarded-User X-Forwarded-Roles Header。在GeoServer的安全配置中,你需要启用“角色来源自Header”的选项,并指定角色Header的名字。这样,代理层传递什么角色,GeoServer就为其赋予什么角色,实现了权限的动态传递。

对于大多数内部系统或API集成场景,我推荐使用第2种“代理用户映射”方式,因为它将身份认证和权限管理解耦,职责清晰。GeoServer管理员只需要管理好 proxy_user 的权限即可。接下来,我们就进入实操配置环节。

3. GeoServer端配置详解

假设我们已经有了一个运行中的GeoServer,并且确保它只能通过内网或本机的反向代理访问。下面我们一步步启用并配置HTTP Header认证。

3.1 安装与启用认证过滤器

GeoServer的HTTP Header认证功能由一个社区模块提供。如果你使用的是 bin 安装包,需要手动下载对应的 jar 包。

  1. 确定版本 :首先,访问GeoServer官网的下载页面,找到与你GeoServer版本完全一致的“Extensions”(扩展)列表。例如,对于GeoServer 2.24.x,你需要寻找 geoserver-2.24-SNAPSHOT-header-auth-plugin.zip 或类似名称的插件。
  2. 安装插件 :下载ZIP包后,解压,将其中的 jar 文件复制到GeoServer安装目录的 WEB-INF/lib 文件夹下。例如: /usr/share/geoserver/WEB-INF/lib/
  3. 重启GeoServer :复制完成后,重启GeoServer应用服务器(如Tomcat、Jetty)。重启后,该插件才会被加载。

实操心得 :在Docker环境下安装更简单。如果你使用的是 docker-compose ,可以在你的 docker-compose.yml 文件里,将插件 jar 包所在的目录挂载到容器内的 /opt/geoserver/WEB-INF/lib/ 路径。这样每次启动容器都会自动加载插件,无需手动进入容器操作。例如:

services:
  geoserver:
    image: geoserver:2.24
    volumes:
      - ./plugins/header-auth:/opt/geoserver/WEB-INF/lib

3.2 配置认证过滤器链

重启后,以管理员身份登录GeoServer Web管理界面。左侧导航栏找到 “Security” -> “Authentication”

  1. 选择过滤器链 :在“Authentication”页面,你会看到“Filter Chains”部分。这里管理着GeoServer处理认证的流程。我们需要编辑“web”过滤器链(负责Web管理界面和OGC服务端点)。
  2. 添加过滤器 :点击“web”链对应的编辑按钮(铅笔图标)。在过滤器列表中,你会看到一系列已存在的过滤器,如 anonymous form 等。我们需要在合适的位置插入Header认证过滤器。
    • 位置很重要 :Header认证过滤器(通常叫 header header-auth )应该放在 anonymous 过滤器 之前 。这是因为认证链是按顺序执行的,如果先执行了 anonymous ,请求就会被标记为匿名用户,后续的Header认证可能就不生效了。
    • 操作 :从下方的“Available Filters”中找到 header Header Authentication Filter ,选中它,然后点击向右的箭头,将其添加到当前链中。然后,使用上移/下移按钮,将其调整到 form 过滤器之后、 anonymous 过滤器之前的一个位置。一个常见的顺序是: form , header , anonymous , basic , digest ...。
  3. 保存链配置 :调整好顺序后,点击“Save”保存过滤器链。

3.3 配置Header认证过滤器参数

添加了过滤器后,页面上会出现该过滤器的配置链接,或者你需要回到“Authentication”主页面,在“Authentication Filters”选项卡中找到名为 header 的过滤器进行配置。

关键配置项如下:

  • Filter name : 保持默认 header 即可。
  • Header name : 输入你的代理服务器将会设置的Header名称。 必须与代理服务器设置的Header名称完全一致,包括大小写 。例如: X-Forwarded-User
  • Header value regex : 这是一个正则表达式,用于验证Header值的格式。如果你只是传递简单的用户名(不含特殊字符),可以设为 .* ,表示匹配任何值。如果你想做更严格的校验,例如只允许字母数字,可以设为 ^[a-zA-Z0-9]+$ 注意 :如果用户名是邮箱格式, . 在正则里是特殊字符,需要转义或使用更宽松的表达式。
  • Roles header name : (可选)如果你使用动态角色映射,在此处输入传递角色的Header名,如 X-Forwarded-Roles 。角色值可以是逗号分隔的列表,如 admin,user,viewer
  • Reverse proxy IP list : 这是最重要的安全配置! 在这里,你需要填入你完全信任的反向代理服务器的IP地址。GeoServer只会接受来自这些IP的、带有指定Header的请求。通常,如果你的Nginx和GeoServer在同一台机器,这里填 127.0.0.1 。如果是内网的一个网关集群,可以填CIDR格式的网段,如 192.168.1.0/24 切勿留空或填 0.0.0.0/0 ,那意味着接受来自任何IP的伪造Header,极其危险。
  • Convert to uppercase : 通常不勾选。保持Header值原样。
  • User group service : 选择GeoServer中已有的用户组服务,通常是默认的 default

配置完成后,点击“Save”。

3.4 创建并配置代理用户

现在,我们需要在GeoServer内部创建一个用户,用来映射所有通过Header认证进来的请求。

  1. 创建用户 :导航至 “Security” -> “Users, Groups, Roles” -> “Users” 。点击“Add new user”。
    • Username : 输入一个专用用户名,例如 proxy_user
    • Password : 设置一个强密码。 虽然这个密码不会用于Header认证登录,但出于安全习惯仍需设置
    • Enabled : 务必勾选。
    • 点击“Save”。
  2. 为用户分配角色 :在用户列表找到刚创建的 proxy_user ,点击其所属的“Roles”链接(通常显示为 USER 等)。在角色分配页面,从左侧“Available roles”中选择你想要赋予这个代理用户的角色,例如 ADMIN (管理员)、 GROUP_ADMIN (组管理员)或自定义的角色,然后添加到右侧。根据你的权限规划进行分配。对于一个只读的地图服务,赋予 ROLE_READ_ALL 可能就够了。
  3. 配置角色映射(如果使用动态角色) :如果你在过滤器中配置了 Roles header name ,并希望GeoServer直接使用Header中的角色,那么还需要在 “Security” -> “Roles” -> “Role Services” 中,编辑默认的角色服务,确保“从Header获取角色”的选项被启用(具体名称可能因插件版本而异)。同时,你需要在GeoServer中预先创建好这些角色名。

至此,GeoServer端的配置就全部完成了。接下来,我们需要在反向代理层(以Nginx为例)进行相应的配置。

4. 反向代理层配置(以Nginx为例)

Nginx在这里承担两个核心职责:1. 作为GeoServer对外的唯一入口,屏蔽直接访问;2. 在转发请求前,进行主认证并添加可信的Header。

4.1 基础代理配置

首先,配置一个基本的反向代理,将请求转发给后端的GeoServer。

server {
    listen 80;
    server_name geoserver.yourdomain.com;
    # 强烈建议监听443端口并配置SSL,这里以80为例
    location /geoserver/ { # 假设GeoServer部署在/geoserver上下文路径下
        proxy_pass http://localhost:8080/geoserver/; # GeoServer内网地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 以下是关键:添加我们约定的认证Header
        # 假设你的主认证系统(如JWT校验)在Nginx的`auth_request`阶段或Lua脚本中完成,
        # 并已将用户名存储在变量$geo_user中。
        # 这里我们先写死一个值`proxy_user`进行测试。
        proxy_set_header X-Forwarded-User "proxy_user";
        
        # 如果需要传递角色,也可以添加
        # proxy_set_header X-Forwarded-Roles "ADMIN,OWS";
    }
}

这个配置将所有访问 /geoserver/ 的请求代理到本机8080端口的GeoServer,并添加了 X-Forwarded-User: proxy_user 这个Header。

4.2 集成主认证模块

在实际生产环境中, proxy_set_header X-Forwarded-User “proxy_user”; 这行不能写死。用户名应该来自于一个前置的认证步骤。Nginx有几种方式实现:

  1. auth_request 模块 :这是最优雅的方式。你可以配置一个独立的认证服务(比如一个轻量级的Go或Python服务,用于校验JWT)。Nginx会在转发请求前,先向这个认证服务发起一个子请求,认证服务返回200则通过,并可以在响应头中告诉Nginx用户名是什么,Nginx再将其添加到转发给GeoServer的Header中。
    location /geoserver/ {
        auth_request /auth; # 发起认证子请求
        auth_request_set $user $upstream_http_x_user; # 从认证服务响应头中提取用户名
        proxy_set_header X-Forwarded-User $user; # 设置Header
        ... # 其他proxy_*配置
    }
    location = /auth {
        internal; # 内部location,外部无法直接访问
        proxy_pass http://auth-service:8081/validate; # 你的认证服务端点
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
    
  2. 使用 lua-nginx-module :通过Lua脚本实现复杂的认证逻辑,如解析JWT、查询数据库等,然后动态设置 ngx.var.geo_user 变量,再在 proxy_set_header 中引用。
  3. http_sub_module 或外部认证脚本 :相对老旧或复杂的方式,不推荐。

注意事项 :无论采用哪种方式,都必须确保认证逻辑本身是安全的,并且认证服务与Nginx之间的通信也是受保护的(如内网通信)。同时,要处理好认证失败的情况,Nginx应直接返回401或403,而不会将请求转发给GeoServer。

配置好Nginx并重载配置后,整个链路就通了。外部用户访问 https://geoserver.yourdomain.com/geoserver/ ,经过Nginx认证后,携带Header访问内网GeoServer,GeoServer信任该Header并识别为用户 proxy_user ,最终根据 proxy_user 的权限返回数据或拒绝访问。

5. 使用Postman进行全链路测试

配置完成后,如何验证一切工作正常?直接让前端应用调用太慢,用 curl 命令又不够直观。Postman是进行API测试的绝佳工具,它能清晰地展示请求和响应的每一个细节。下面我们分场景测试。

5.1 测试场景一:验证代理链路与Header传递

首先,我们测试Nginx代理是否正常工作,以及Header是否正确传递。

  1. 创建新请求 :在Postman中新建一个 GET 请求。
  2. 设置URL :输入你的公网访问地址,例如 http://geoserver.yourdomain.com/geoserver/ows?service=WMS&version=1.3.0&request=GetCapabilities 。这是一个获取WMS服务能力的标准请求,通常允许匿名访问,适合做连通性测试。
  3. 发送请求 :直接点击“Send”。你应该能成功收到一个庞大的XML格式的 GetCapabilities 响应。这说明Nginx代理基本通畅。
  4. 验证GeoServer日志 :打开GeoServer的日志文件(通常位于 GEOSERVER_DATA_DIR/logs/geoserver.log ),查看刚才的请求。你应该能看到访问日志,并且用户可能是 anonymous ROLE_ANONYMOUS 。因为此时我们还没有触发Header认证。

5.2 测试场景二:触发Header认证

接下来,我们模拟一个已通过Nginx主认证的请求,即直接让请求携带正确的Header访问GeoServer。 注意:由于我们配置了 Reverse proxy IP list ,这个测试必须通过Nginx进行,不能直接发送到GeoServer的8080端口。

  1. 在Postman中添加Header :在刚才的请求中,切换到“Headers”选项卡。
  2. 添加自定义Header :添加一个键为 X-Forwarded-User ,值为 proxy_user 的Header。
  3. 再次发送请求 :点击“Send”。
  4. 分析结果
    • 如果成功 :你依然会收到 GetCapabilities 响应。此时查看GeoServer日志,你会发现这次请求的用户名变成了 proxy_user ,而不是 anonymous 。这说明Header认证生效了!
    • 如果失败(返回403 Forbidden) :这可能是好事,说明 proxy_user 这个用户没有被授权访问WMS的 GetCapabilities 操作。你需要去GeoServer的“Security” -> “Data” -> “Layer”或“Service”规则中,为 proxy_user 或其所属角色添加相应的 WMS GetCapabilities 权限。

5.3 测试场景三:测试权限控制

为了更清晰地验证权限,我们可以测试一个需要特定权限的操作,比如访问一个受保护的图层,或者进行一个 GetMap 请求。

  1. 创建一个需要认证的请求 :例如, GET 请求URL为: http://geoserver.yourdomain.com/geoserver/wms?service=WMS&version=1.3.0&request=GetMap&... (填入你的图层参数)。
  2. 不带Header发送 :不添加 X-Forwarded-User Header,直接发送。预期应该返回 401 Unauthorized 403 Forbidden (取决于GeoServer的匿名设置)。这证明了服务已被保护。
  3. 带上Header发送 :添加 X-Forwarded-User: proxy_user Header后再次发送。如果 proxy_user 有该图层的读取权限,你将收到地图图片;如果没有权限,则会返回 403 Forbidden 。这证明了权限系统在按预期工作。

5.4 Postman高级技巧:环境变量与测试脚本

在持续测试和集成中,手动添加Header很麻烦。Postman的环境变量和预请求脚本可以自动化这个过程。

  1. 创建环境变量 :在Postman中创建一个环境(如 GeoServer Prod ),添加一个变量 auth_header ,值为 proxy_user 。再添加一个变量 base_url ,值为你的GeoServer公网地址。
  2. 在请求中使用变量 :将请求URL改为 {{base_url}}/geoserver/ows?... 。在Header中,将 X-Forwarded-User 的值设置为 {{auth_header}}
  3. 使用预请求脚本动态生成Header :如果你的认证是基于JWT等动态令牌,可以在“Pre-request Script”标签页中编写JavaScript代码,来计算或获取令牌,并自动设置到请求Header中。
    // 示例:假设你需要从某个接口获取一个临时Token,并放到名为‘Authorization’的Header中,然后Nginx会据此解析出用户并设置X-Forwarded-User
    // 注意:这个脚本是在Postman客户端运行的
    const getToken = require('./your-auth-logic'); // 假设有自定义模块
    const token = getToken();
    pm.request.headers.add({key: 'Authorization', value: `Bearer ${token}`});
    
  4. 编写测试脚本进行断言 :在“Tests”标签页,你可以用JavaScript对响应结果进行断言,自动化验证接口是否返回预期状态码、包含特定内容等。
    pm.test("Status code is 200", function () {
        pm.response.to.have.status(200);
    });
    pm.test("Response is XML", function () {
        pm.response.to.have.header("Content-Type", "application/xml");
    });
    pm.test("Capabilities contains expected layer", function () {
        pm.expect(pm.response.text()).to.include("<Name>your_layer_name</Name>");
    });
    

通过这些测试,你可以构建一个完整的、可重复执行的GeoServer接口测试集,非常适合在部署流水线或日常巡检中使用。

6. 常见问题排查与安全加固实录

即便按照步骤配置,也难免会遇到问题。下面是我在多次部署中总结的常见坑点和排查思路。

6.1 认证失败的排查路径

当Header认证不生效时,按照以下顺序排查:

现象 可能原因 排查方法
添加Header后仍显示匿名用户 1. Header名称大小写不匹配。
2. 过滤器链顺序错误, anonymous 过滤器在 header 之前执行。
3. 请求未经过配置的反向代理,直接访问了GeoServer端口。
1. 检查GeoServer配置的 Header name 和Nginx中 proxy_set_header 的键名是否 完全一致
2. 在GeoServer“Authentication”页面,检查“web”过滤器链顺序,确保 header anonymous 之前。
3. 检查GeoServer日志,查看请求来源IP。确认它来自你配置的 Reverse proxy IP list 中的IP(如127.0.0.1)。
返回403 Forbidden 1. Header认证成功,但映射的用户( proxy_user )没有对应资源的访问权限。
2. 角色Header配置了但角色不存在。
1. 在GeoServer“Security” -> “Users, Groups, Roles”中,确认 proxy_user 已被启用且分配了正确角色。
2. 在“Security” -> “Data” -> “Layer/Services”规则中,确认该角色有相应权限。
3. 检查角色Header的值,并在GeoServer角色列表中确认这些角色存在。
任何带Header的请求都失败 Reverse proxy IP list 配置错误,GeoServer不信任请求来源。 1. 检查Nginx所在服务器的IP是否在信任列表中。
2. 如果Nginx和GeoServer在同一主机,使用 127.0.0.1
3. 切勿使用 0.0.0.0/0
GeoServer管理界面无法登录 错误地将 header 过滤器添加到了 web 链的首位,导致管理登录请求也被要求Header认证。 调整过滤器链顺序,确保 form 认证在 header 之前,这样访问 /geoserver/web 的登录请求会先走表单认证。

6.2 安全加固要点

配置只是开始,安全需要持续关注。以下加固措施至关重要:

  1. 强制HTTPS :在Nginx层面配置SSL/TLS,将所有HTTP请求重定向到HTTPS。确保 X-Forwarded-Proto 头被正确设置,GeoServer有时会根据这个头判断是否使用安全连接。
  2. 限制代理IP列表 Reverse proxy IP list 是生命线。除了指定IP,如果可能,在服务器防火墙(如 iptables firewalld )或安全组层面,进一步限制只有反向代理服务器可以访问GeoServer的端口(如8080)。
  3. 定期审计日志 :定期检查GeoServer的访问日志和错误日志。关注异常IP、频繁的认证失败、越权访问尝试等。可以配置日志聚合工具(如ELK Stack)进行集中分析和告警。
  4. 最小权限原则 :为 proxy_user 分配恰好够用的权限,而不是直接给 ADMIN 角色。如果只是提供地图服务,创建只有 ROLE_READ_ALL 或针对特定工作空间/图层权限的自定义角色。
  5. Header防伪造 :虽然我们信任反向代理,但也要防止代理服务器自身被攻破后伪造Header。确保Nginx/网关服务器的安全,及时更新,使用非root用户运行。可以考虑在Nginx和GeoServer之间使用客户端证书认证(mTLS)来增加一层内部通信的安全保障。
  6. 禁用默认用户 :GeoServer安装后有一个默认的 admin 用户。务必修改其默认密码,并考虑创建一个新的管理员用户后,禁用或重命名这个默认账户。

6.3 性能与高可用考量

在生产环境中,还需要考虑:

  • 连接池与超时 :在Nginx的 upstream 配置中,针对GeoServer后端设置合理的连接池、超时和重试机制,避免因单个请求阻塞导致服务雪崩。
  • 缓存策略 :对于不常变动的瓦片(Tile)或 GetCapabilities 响应,可以在Nginx层面设置缓存,显著降低GeoServer负载。使用 proxy_cache 指令。
  • 多实例与负载均衡 :如果流量很大,可以部署多个GeoServer实例,在Nginx upstream中配置负载均衡。注意,如果使用了集群配置,需要确保所有实例的安全配置(用户、角色、规则)完全同步。

配置HTTP Header认证,看似只是增加了一个过滤器,实则是对GeoServer安全架构的一次升级。它将GeoServer从边界认证点转变为受信任的内部服务,更符合现代微服务和安全网关的设计模式。整个过程的核心在于理解“信任边界”的转移,并严格配置好这条信任链路上的每一个环节。用Postman逐步测试,则能帮你清晰地验证每一个环节是否按预期工作。当你看到带着自定义Header的请求,在GeoServer日志里显示为指定的用户时,那种一切尽在掌握的感觉,就是对我们这些运维和开发人员最好的回报。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值