跳到主要内容

权限管理

TDengine 中的权限管理分为 用户管理、数据库授权管理以及消息订阅授权管理,本节重点说明数据库授权和订阅授权。 授权管理仅在 TDengine 企业版中可用,请联系 TDengine 销售团队。授权语法在社区版可用,但不起作用。

数据库访问授权​

系统管理员可以根据业务需要对系统中的每个用户针对每个数据库进行特定的授权,以防止业务数据被不恰当的用户读取或修改。对某个用户进行数据库访问授权的语法如下:

GRANT privileges ON priv_level TO user_name

privileges : {
ALL
| priv_type [, priv_type] ...
}

priv_type : {
READ
| WRITE
}

priv_level : {
dbname.tbname
| dbname.*
| *.*
}

对数据库的访问权限包含读和写两种权限,它们可以被分别授予,也可以被同时授予。

说明

  • priv_level 格式中 "." 之前为数据库名称,"." 之后为表名称,意思为表级别的授权控制。如果 "." 之后为 "*",意为 "." 前所指定的数据库中的所有表
  • "dbname.*" 意思是名为 "dbname" 的数据库中的所有表
  • "*.*" 意思是所有数据库名中的所有表

数据库权限说明​

对 root 用户和普通用户的权限的说明如下表

用户描述权限说明
超级用户只有 root 是超级用户
DB 外部:所有操作权限,例如 user、dnode、udf、qnode 等的 CRUD
DB 权限:包括创建、删除、修改 Option、移动 Vgruop、读、写、Enable/Disable 用户
普通用户除 root 以外的其它用户均为普通用户
在可读的 DB 中:普通用户可以进行读操作 select、describe、show、subscribe
在可写 DB 的内部,用户可以进行写操作,创建、删除、修改超级表,创建、删除、修改子表,创建、删除、修改 topic。写入数据
被限制系统信息时,不可进行如下操作 show dnode、mnode、vgroups、qnode、snode、修改用户包括自身密码、show db 时只能看到自己的 db,并且不能看到 vgroups、副本、cache 等信息
无论是否被限制系统信息,都可以管理 udf,可以创建 DB、自己创建的 DB 具备所有权限、非自己创建的 DB,参照读、写列表中的权限

消息订阅授权​

任意用户都可以在自己拥有读权限的数据库上创建 topic。超级用户 root 可以在任意数据库上创建 topic。每个 topic 的订阅权限都可以被独立授权给任何用户,不管该用户是否拥有该数据库的访问权限。删除 topic 只能由 root 用户或者该 topic 的创建者进行。topic 只能由超级用户、topic 的创建者或者被显式授予 subscribe 权限的用户订阅。

具体的 SQL 语法如下:

GRANT SUBSCRIBE ON topic_name TO user_name

REVOKE SUBSCRIBE ON topic_name FROM user_name

基于标签的授权(表级授权)​

从 v3.0.5.0 开始,我们支持按标签授权某个超级表中部分特定的子表。具体的 SQL 语法如下。

GRANT privileges ON priv_level [WITH tag_condition] TO user_name

privileges : {
ALL
| priv_type [, priv_type] ...
}

priv_type : {
READ
| WRITE
}

priv_level : {
dbname.tbname
| dbname.*
| *.*
}

REVOKE privileges ON priv_level [WITH tag_condition] FROM user_name

privileges : {
ALL
| priv_type [, priv_type] ...
}

priv_type : {
READ
| WRITE
}

priv_level : {
dbname.tbname
| dbname.*
| *.*
}

上面 SQL 的语义为:

  • 用户可以通过 dbname.tbname 来为指定的表(包括超级表和普通表)授予或回收其读写权限,不支持直接对子表授予或回收权限。
  • 用户可以通过 dbname.tbname 和 WITH 子句来为符合条件的所有子表授予或回收其读写权限。使用 WITH 子句时,权限级别必须为超级表。

表级权限和数据库权限的关系​

下表列出了在不同的数据库授权和表级授权的组合下产生的实际权限。

表无授权表读授权表读授权有标签条件表写授权表写授权有标签条件
数据库无授权无授权对此表有读权限,对数据库下的其他表无权限对此表符合标签权限的子表有读权限,对数据库下的其他表无权限对此表有写权限,对数据库下的其他表无权限对此表符合标签权限的子表有写权限,对数据库下的其他表无权限
数据库读授权对所有表有读权限对所有表有读权限对此表符合标签权限的子表有读权限,对数据库下的其他表有读权限对此表有写权限,对所有表有读权限对此表符合标签权限的子表有写权限,所有表有读权限
数据库写授权对所有表有写权限对此表有读权限,对所有表有写权限对此表符合标签权限的子表有读权限,对所有表有写权限对所有表有写权限对此表符合标签权限的子表有写权限,数据库下的其他表有写权限

查看用户授权​

使用下面的命令可以显示一个用户所拥有的授权:

show user privileges 

撤销授权​

  1. 撤销数据库访问的授权
REVOKE privileges ON priv_level FROM user_name

privileges : {
ALL
| priv_type [, priv_type] ...
}

priv_type : {
READ
| WRITE
}

priv_level : {
dbname.tbname
| dbname.*
| *.*
}
  1. 撤销数据订阅的授权
REVOKE privileges ON priv_level FROM user_name

privileges : {
ALL
| priv_type [, priv_type] ...
}

priv_type : {
SUBSCRIBE
}

priv_level : {
topic_name
}