hive权限管理

本文介绍了Hive中的权限管理机制,包括存储基础授权、基于SQL标准的授权和默认授权三种模型。详细阐述了每种授权模型的配置方法及限制条件,并探讨了在实际应用中的常见问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Hive编程指南》第18章 安全有相关内容可参考。

环境:

HDP2.4 ,hive-1.2.0, ambari统一管理

目前hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员,也就对hive中的所有表都有查看和改动的权利,这样是不符合一般数据仓库的安全原则的。下面来介绍HIVE的权限管理。

Hive用户

1. Hive作为表存储层。
    使用对象:Hive's HCatalog API如Apache Pig, MapReduce 和一些大量的并行数据库, 有直接操作HDFS和元数据server的权限
2. Hive作为SQL查询引擎。
    a. hive cli: 同样有HDFS和Hive metastore操作权限
    b. ODBC/JDBC和其他HiveServer2 API users (Beeline CLI is an example),通过HiveServer2操作。
Hive三种授权模型

1. Storage Based Authorization in the Metastore Server(SBA)

 通常用于Metastore Server API的授权;hive用户1和2a, Hive配置不控制权限,通过HDFS文件进行 权限控制;hive用户2b 使用需要hive.server2.enable.doAs =true

注意:Hive 0.12.0版本之后开始支持;使用HDFS ACL(Hadoop 2.4以后版本支持)灵活控制
虽然能够保护Metastore中的元数据不被恶意用户破坏,可控制数据库、表和分区但是没有提供细粒度的访问控制(列级别、行级别)

hive-site.xml配置:

    roperty>  
    <name>hive.metastore.pre.event.listeners</name>  
    <value> org.apache.hadoop.hive.ql.security.authorization.AuthorizationPreEventListener</value>  
    <description>turns on metastore-side security</description>  
    </property>  
      
    <property>  
    <name>hive.security.metastore.authorization.manager</name>  
    <value>  org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider</value>  
    <description>This tells Hive which metastore-side authorization provider to use. The default setting uses DefaultHiveMetastoreAuthorizationProvider, which implements the standard Hive grant/revoke model. To use an HDFS permission-based model (recommended) to do your authorization, use StorageBasedAuthorizationProvider as instructed above.</description>  
    </property>  
      
    <property>  
    <name>hive.security.metastore.authenticator.manager</name>  
    <value> org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator</value>  
      <description>authenticator manager class name to be used in the metastore for authentication.  
      The user defined authenticator should implement interface   
      org.apache.hadoop.hive.ql.security.HiveAuthenticationProvider.  
      </description>  
    </property>  
      
    <property>  
    <name>hive.security.metastore.authorization.auth.reads</name>  
    <value> true</value>  
    <description>default=true,When this is set to true, Hive metastore authorization also checks for read access.</description>  
    </property>  

2. SQL Standards Based Authorization in HiveServer2(SSBA)

基于SQL标准的Hive授权为Hive授权提供了第三个选择,它完全兼容SQL的授权模型,不会给现在的用户带来向后兼容的问题,因此被推荐使用。一旦用户迁移到这种更加安全的授权机制后,默认的授权机制可以被遗弃掉。

基于SQL的授权模型可以和基于存储的授权模型(Hive Metastore Server)结合使用。

授权确认时是以提交SQL指令的用户身份为依据的,但SQL指令是以Hive Server用户身份(即Hive Server的进程用户)被执行的,因此Hive Server用户必须拥有相应目录(文件)的权限(根据SQL指令的不同,所需权限也不同)。

基于HiveServer2可提供行列级别的细粒度权限控制
在这种授权模型控制下,拥有权限使用Hive CLI、HDFS commands、Pig command line、'hadoop jar' 等工具(指令)的用户被称为特权用户。在一个组织(团队)内,仅仅一些需要执行ETL相关工作的团队需要这些特殊权限,这些工具的访问不经过HiveServer2,因此它们不受这种授权模型的控制。对于需要通过Hive CLI、Pig和MapReduce访问Hive表的用户,可以通过在Hive Metastore Server中启用Storage Based Authorization来进行相应的权限控制(否则hive cli无法进行权限控制)其它情况则可能需要结合Hadoop的安全机制进行。
限制:

(1)当授权enbled, 命令dfs, add, delete, compile和reset  disabled.

(2)transform clause被禁用。

(3)改变Hive配置的指令集合被限制为仅某些用户可以执行,可以通过hive.security.authorization.sqlstd.confwhitelist(hive-site.xml)进行配置。
(4)添加或删除函数、宏的权限被限制为仅具有admin角色的用户可以执行。
(5) 为了用户可以使用(自定义)函数,创建永久函数(create permanent functions)的功能被添加。拥有角色admin的用户可以执行该指令添加函数,所有添加的函数可以被所有的用户使用。

hive-site.xml配置:

    <property>  
    <name>hive.security.authorization.enabled</name>  
    <value>true</value>  
    </property>  
      
    <property>  
        <name>hive.server2.enable.doAs</name>  
        <value>false</value>  
    </property>  
      
    <property>  
        <name>hive.users.in.admin.role</name>  
        <value>hive</value>  
    </property>  
      
    <property>  
    <name>hive.security.authorization.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>  
    </property>  
      
    <property>  
    <name>hive.security.authenticator.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>  
    </property>  
      
    <!--  
    <property>  
    <name>hive.metastore.uris</name>  
    <value>''</value>  
    </property>  
      
    <property>  
    <name>hive.conf.restricted.list</name>   
    <value>hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager</value>   
    </property>  
    -->  

注意:

(1)拥有admin角色的用户需要运行命令“set role admin"去获取admin角色的权限;

配置完这个可以在元数据表中查询到

<property>  
    <name>hive.users.in.admin.role</name>  
    <value>hive</value>  
</property> 

查询: select * from Role_Map;

a. [Important] Before restarting HiveServer2, firstly grant admin role to the user in Beeline.  
  
grant admin to user mapr;  
This is to make sure the specified admin user has the admin role.  
If we ignore this step in Hive 0.13, then later we can not set the role to admin even if the user is specified in  hive.users.in.admin.role.  
For example:  
0: jdbc:hive2://xxx:10000/default> set hive.users.in.admin.role;  
+----------------------------------------------+  
|                     set                      |  
+----------------------------------------------+  
| hive.users.in.admin.role=mapr                |  
+----------------------------------------------+  
1 row selected (0.05 seconds)  
  
0: jdbc:hive2://xxx:10000/default> set role admin;      
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. mapr doesn't belong to role admin (state=08S01,code=1)  
b. Start HiveServer2 with the following additional command-line options.  
  
-hiveconf hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory  
-hiveconf hive.security.authorization.enabled=true  
-hiveconf hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator  
c.  Test admin role.  
  
0: jdbc:hive2://xxx:xxx/default> set role admin;                                             
No rows affected (0.824 seconds)  
0: jdbc:hive2://xxx:xxx/default> show current roles;  
+--------+  
|  role  |  
+--------+  
| admin  |  
|        |  
+--------+  
2 rows selected (0.391 seconds)
(2)HiveServer2可以配置了用嵌入的metastore( 这个没有测试)

hiveserver2-site.xml的配置:

    <property>  
    <name>hive.security.authorization.enabled</name>  
    <value>true</value>  
    </property>  
      
    <property>  
    <name>hive.security.authorization.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>  
    </property>  
      
    <property>  
    <name>hive.security.authenticator.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>  
    </property>  
      
    <property>  
    <name>hive.metastore.uris</name>   
    <value>thrift://localhost:9083</value>  
    </property>  
3. Hive Default Authorization
 缺陷:类似于关系型的授权模式,但用户的授权许可没有定义,任何用户都可以授权和撤回
 类似2,提供grant/revoke控制权限,Hive Cli支持

Hive授权定义在不同级别: Users Groups Roles, 其中之一的权限checks通过, hive操作即可执行

默认情况,metastore使用HadoopDefaultAuthenticator

hive-site.xml配置:

    <property>    
      <name>hive.security.authorization.enabled</name>     
      <value>true</value>    
      <description>Enable or disable the hive client authorization</description>    
    </property>   
      
    <property>    
      <name>hive.security.authorization.createtable.owner.grants</name>    
      <value>ALL</value>    
      <description>The privileges automatically granted to the owner whenever    
      a table gets created.An example like "select,drop" will grant select    
      and drop privilege to the owner of the table</description>    
    </property>   
      
    <!--可选,未测-->  
    <property>    
      <name>hive.security.authorization.createtable.user.grants</name>    
      <value>ALL</value>    
    </property>   
      
    <!--可选,未测-->  
    <property>    
      <name>hive.security.authorization.createtable.group.grants</name>    
      <value>ALL</value>    
    </property>   
      
    <!--可选,未测-->  
    <property>    
      <name>hive.security.authorization.createtable.role.grants</name>    
      <value>ALL</value>    
    </property>  
      
    <property>  
    <name>hive.security.authorization.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.authorization.DefaultHiveMetastoreAuthorizationProvider</value>  
    <description>The hive client authorization manager class name.</description>    
    </property>  
      
    <property>  
    <name>hive.security.authenticator.manager</name>   
    <value>org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator</value>   
    </property>  

我的配置:


Ambari配置按上面配置会有一个报错:hive.security.authorization.enabled= true后hive_security_authorization should not be None if hive.security.authorization.enabled is set。

如何配置:https://issues.apache.org/jira/browse/AMBARI-11575

Privileges, Users 和Roles

(1) Privileges可以被授权给Users和Roles;

(2) Users可以有一个或多个角色

默认角色都是public, 所有的用户都有public角色。只有Admin角色可以create/drop/set/show roles.

元数据表:

Db_privs:记录了User/Role在DB上的权限
Tbl_privs:记录了User/Role在table上的权限
Tbl_col_privs:记录了User/Role在table column上的权限
Roles:记录了所有创建的role
Role_map:记录了User与Role的对应关系

hive> set role admin;  
hive> show roles;  
OK  
admin  
public  
role_test1  
hive> create role role_test2;OK  
Time taken: 0.644 seconds  
hive> drop  role role_test1;  
hive> show roles;  
OK  
admin  
public  
role_test2

Grant/Revoke Roles

SHOW GRANT principal_specification  
[ON object_specification [(column_list)]]  
   
principal_specification:  
    USER user  
  | GROUP group  
  | ROLE role  
   
object_specification:  
    TABLE tbl_name  
  | DATABASE db_name  
  
eg:GRANT UPDATE  ON table test to user hive;
    hive> GRANT UPDATE  ON table test to user hive;  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Permission denied: Principal [name=hive, type=USER] does not have following privileges for operation GRANT_PRIVILEGE [[UPDATE with grant] on Object [type=TABLE_OR_VIEW, name=default.test]]  
    hive> set role admin;  
    OK  
    Time taken: 0.037 seconds  
    hive> show current roles;  
    OK  
    admin  
    Time taken: 0.13 seconds, Fetched: 1 row(s)  
    hive> GRANT UPDATE  ON table test to user hive;  
    OK  
    Time taken: 1.006 seconds  
    hive> alter table test rename to test01;  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. No privilege 'Alter' found for outputs { database:default, table:test}  
    hive> create database test02;  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:No privilege 'Create' found for outputs { database:test02})  
这个不明白,为什么不能正常的授权??  
0: jdbc:hive2://XXXX:10000> GRANT select ON DATABASE test TO USER hive;  
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Error getting object from metastore for Object [type=DATABASE, name=test] (state=08S01,code=1)
    <pre name="code" class="plain">hive> GRANT SELECT ON TABLE test TO USER hive;  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Permission denied: Principal [name=hive, type=USER] does not have following privileges for operation GRANT_PRIVILEGE [[SELECT with grant] on Object [type=TABLE_OR_VIEW, name=default.test]]  
    hive> set role admin;  
    OK  
    Time taken: 0.06 seconds  
    hive> GRANT SELECT ON TABLE test TO USER hive;  
    OK  
    Time taken: 0.566 seconds  
    hive> GRANT ALL ON TABLE test TO USER hive; #######这里不明白#######  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Error granting privileges: null   
    hive> revoke insert on table test_hive from user hive;  
    OK  
    Time taken: 0.191 seconds  
    hive> show grant user hive on table test_hive;  
    OK  
    default    test_hive            hive    USER    DELETE    true    1467708923000    hive  
    default    test_hive            hive    USER    SELECT    true    1467708923000    hive  
    default    test_hive            hive    USER    UPDATE    true    1467708923000    hive  
    Time taken: 0.031 seconds, Fetched: 3 row(s)  
    hive> insert into test_hive values(5,"rows5");  
    Query ID = hive_20160707015802_fadf5833-7367-4538-b2a9-71230cd10efd  
    Total jobs = 1  
    Launching Job 1 out of 1  
    Tez session was closed. Reopening...  
    Session re-established.  
      
      
    Status: Running (Executing on YARN cluster with App id application_1467857886938_0008)  
      
    --------------------------------------------------------------------------------  
            VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED  
    --------------------------------------------------------------------------------  
    Map 1 ..........   SUCCEEDED      1          1        0        0       0       0  
    --------------------------------------------------------------------------------  
    VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 56.18 s      
    --------------------------------------------------------------------------------  
    Loading data to table default.test_hive  
    Failed with exception Unable to alter table. No privilege 'Alter' found for outputs { database:default, table:test_hive}  
    FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask  
    hivemetastore.log报错  
    2016-07-06 23:46:52,613 ERROR [pool-3-thread-161]: metastore.RetryingHMSHandler (RetryingHMSHandler.java:invoke(159)) - MetaException(message:No privilege 'Alter' found for outputs { database:default, table:test}) at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.firePreEvent(HiveMetaStore.java:2026)  

一个很常见的错误:

[root@l1035lab ~]# hive
Logging initialized using configuration in file:/etc/hive/conf/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hdp/2.2.4.2-2/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/2.2.4.2-2/hive/lib/hive-jdbc-0.14.0.2.2.4.2-2-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.security.AccessControlException:
Permission denied: user=root, access=WRITE, inode="/user":hdfs:hdfs:drwxr-xr-x
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:238)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:179)
    解决办法:You need to have a user home directory on HDFS. Log as the HDFS user and create a home dir for root.  
    # su  hdfs  
    $ hdfs dfs -mkdir /user/root  
    $ hdfs dfs -chown root:root /user/root  
    如果已经有了/user/root ,查看下文件的权限  
    [root@ambari-2 ~]# hdfs dfs -ls /user  
    Found 6 items  
    drwxrwx---   - ambari-qa hdfs          0 2016-07-01 04:56 /user/ambari-qa  
    drwxr-xr-x   - hcat      hdfs          0 2016-06-29 00:13 /user/hcat  
    drwxr-xr-x   - hdfs      hdfs          0 2016-06-30 18:26 /user/hdfs  
    drwxr-xr-x   - hive      hdfs          0 2016-07-05 04:21 /user/hive  
    drwxr-xr-x   - root      root          0 2016-07-05 02:07 /user/root  
    drwxr-xr-x   - tom       tom           0 2016-07-06 20:20 /user/tom  

参考文献:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization#LanguageManualAuthorization-1StorageBasedAuthorizationintheMetastoreServer

http://m.blog.youkuaiyun.com/article/details?id=51312153

http://hadooptutorial.info/hive-authorization-models-and-hive-security/

http://www.cnblogs.com/yurunmiao/p/4441735.html

点击打开链接











<think>首先,用户的问题是关于Hive权限管理的设置教程。他们想知道如何在Hive中设置和管理权限。我需要根据提供的系统级指令和用户可见层的要求来构建回答。系统级指令的关键点:-所有行内数学表达式使用$...$格式。-独立公式使用$$...$$格式。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层的要求:-回答结构清晰,帮助用户逐步解决问题。-尽量保证回答真实可靠。-参考站内引用:引用[1]到[4]是关于Hive权限管理的。站内引用内容:-引用[1]:介绍Hive权限管理的必要性,默认不开启。-引用[2]:如何通过修改配置文件开启权限管理。-引用[3]:涉及角色创建、权限测试等。-引用[4]:讨论不同的授权模式,如基于存储的授权、基于SQL标准的授权和默认授权。用户上一次的问题可能是关于Hive权限管理的设置,所以我需要基于这些引用构建一个教程。回答结构:1.**引言**:简要介绍Hive权限管理的重要性。2.**步骤**:逐步指导如何设置权限管理。-开启权限管理。-配置相关参数。-创建角色和用户。-授予权限。-测试权限。3.**授权模式**:解释不同的授权模式。4.**注意事项**:提醒常见问题。5.**相关问题**:生成相关问题。确保使用中文回答。在回答中,引用段落末尾添加引用标识,如[^1]。参考引用内容时,自然地融入。例如:-在讨论开启权限时,引用引用[2]。-在讨论授权模式时,引用引用[4]。生成相关问题:-在结尾部分,添加“相关问题”部分。LaTeX使用:-用户问题中没有数学表达式,所以可能不需要LaTeX。但指令说“所有行内数学表达式必须使用”,所以如果有数学内容,就使用。Hive权限管理可能不涉及数学,所以可能不需要。如果有,比如涉及数字或公式,就应用。最终回答:-以清晰、分步方式组织。-结束时添加相关问题。</think>### Hive权限管理设置教程 Hive权限管理是确保数据仓库安全的关键功能。默认情况下,Hive不开启权限控制,所有用户都具有超级管理员权限,这可能导致数据泄露或误操作风险[^1]。本教程将逐步指导你如何设置和管理Hive权限,基于SQL标准的授权模式(推荐方式),确保操作真实可靠。以下是详细步骤: #### 1. **开启Hive权限管理** 首先,修改Hive配置文件以启用授权功能。编辑 `hive-site.xml` 文件,添加以下参数: - 设置 `hive.security.authorization.enabled` 为 `true`,启用权限控制[^2]。 - 可选配置:设置 `hive.security.authorization.createtable.owner.grants` 参数,定义表创建者的默认权限(例如 `ALL` 表示所有权限)[^2]。 ```xml <property> <name>hive.security.authorization.enabled</name> <value>true</value> <description>enable or disable the hive client authorization</description> </property> <property> <name>hive.security.authorization.createtable.owner.grants</name> <value>ALL</value> <description>自动授予表创建者权限</description> </property> ``` 保存文件后,重启Hive服务使配置生效。 #### 2. **配置授权模式** Hive支持多种授权模式,推荐使用**基于SQL标准的授权(HiveServer2)**,因为它提供细粒度控制(如表、列级别权限)[^4]。在 `hive-site.xml` 中确认模式设置: - 确保 `hive.security.authorization.manager` 参数指向 `org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory`。 - 避免使用默认授权模式(Legacy Mode),它仅防止误操作,不防恶意访问[^4]。 #### 3. **创建角色和用户** 使用Hive命令行工具(如Beeline)创建角色和分配权限: - 连接HiveServer2(例如通过Beeline): ```bash beeline -u "jdbc:hive2://<hostname>:10000" -n <username> -p <password> ``` - 创建角色(例如 `readonly`): ```sql CREATE ROLE readonly; ``` - 将角色授予用户或组(例如授予用户组 `analysts`): ```sql GRANT ROLE readonly TO GROUP analysts; ``` 引用[^3]提到,角色管理需结合Hadoop用户组,确保一致性。 #### 4. **授予和撤销权限** 基于SQL语法,为角色分配具体权限: - **授予权限**(例如允许 `readonly` 角色查询表): ```sql GRANT SELECT ON TABLE database.table TO ROLE readonly; ``` - **撤销权限**(例如移除写权限): ```sql REVOKE INSERT ON TABLE database.table FROM ROLE readonly; ``` 支持权限包括:`SELECT`, `INSERT`, `UPDATE`, `DELETE`, `ALL` 等。表创建者默认拥有所有权限,可通过配置调整[^2]。 #### 5. **测试权限设置** 验证权限是否生效: - 切换角色测试(例如在Beeline中): ```sql SET ROLE readonly; SELECT * FROM test_table; -- 应成功 INSERT INTO test_table VALUES (1); -- 应失败,如果未授权 ``` - 查看角色权限: ```sql SHOW ROLE GRANT GROUP analysts; -- 显示角色分配情况 ``` 引用[^3]强调,测试时需确保Kerberos认证等安全机制已启用。 #### 6. **注意事项** - **安全强化**:结合Kerberos认证提升安全性,防止未授权访问[^3]。 - **性能影响**:开启权限管理可能轻微增加元数据操作延迟,建议在生产环境测试。 - **常见问题**:如果权限不生效,检查配置文件和用户组映射(如Hadoop的 `core-site.xml`)。 - **备份**:修改权限前备份元数据,避免误操作。 通过以上步骤,你可以有效管理Hive权限,确保数据安全。Hive权限管理依赖于Hadoop生态系统,建议参考官方文档以适配具体版本[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值