iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >图数据库Nebula Graph访问控制实现原理是什么
  • 779
分享到

图数据库Nebula Graph访问控制实现原理是什么

2024-04-02 19:04:59 779人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关图数据库Nebula Graph访问控制实现原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。摘要:数据库权限管理对大家都很熟悉,

这期内容当中小编将会给大家带来有关图数据库Nebula Graph访问控制实现原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

摘要:数据库权限管理对大家都很熟悉,然而怎么做好数据库权限管理呢?在本文中将详细介绍 Nebula Graph 的用户管理和权限管理。

数据库权限管理对大家来说都已经很熟悉了。Nebula Graph 本身是一个高性能的海量图数据库,数据库的安全问题更是数据库设计的重中之重。目前 Nebula Graph 已支持基于角色的权限控制功能。在这篇文章中将详细介绍 Nebula Graph 的用户管理和权限管理。

Nebula Graph 架构体系

图数据库Nebula Graph访问控制实现原理是什么

由上图可知,Nebula Graph的主体架构分为三部分:Computation Layer、Storage Layer 和 Meta Service。Console 、apiWEB Service 被统称为 Client API。 账户数据和权限数据将被存储在 Meta Engine中,当Query Engine 启动后,将会初始 Meta Client,Query Engine 将通过 Meta Client 与 Meta Service 进行通信。

当用户通过 Client API 连接 Query Engine 时,Query Engine 会通过 Meta Client 查询 Meta Engine 的用户数据,并判断连接账户是否存在,以及密码是否正确。当验证通过后,连接创建成功,用户可以通过这个连接执行数据操作。当用户通过 Client API 发送操作指令后,Query Engine 首先对此指令做语法解析,识别操作类型,通过操作类型、用户角色等信息进行权限判断,如果权限无效,则直接在 Query Engine 阻挡操作,并返回错误信息至 Client API。 在整个权限检查的过程中,Nebula Graph 对 Meta data 进行了缓存,将在以下章节中介绍。

功能描述

在介绍功能之前,需要先描述一下 Nebula Graph 的逻辑结构:Nebula Graph 是一个支持多图空间(Space) 的图数据库,Space 中独立管理 Schema 和 Data,Space 和 Space 之间相互独立。另外,Nebula Graph 还提供了一系列高级命令用于全局管理 Cluster,Cluster 的操作命令和 Space 的操作命令将在下文中详细描述。

因此 Nebula Graph 的权限管理将会基于图空间(Space)角色(Role)操作(Operation) 三个维度进行。详细描述请看下列子章节。

角色划分

Nebula Graph 提供了五种操作角色,分别是 GoD、ADMIN、DBA、USER、GUEST,这五种操作角色基本覆盖了所有的数据安全控制的场景。一个登陆账户(Account)可以在不同的 Space 中拥有不同角色,但一个 Account 在同一个 Space 中只能拥有一种角色。角色讲解:

  • GOD:相当于 linux 操作系统中的 root 用户,拥有最高的管理权限。Nebula Graph Cluster 在初始化时会默认创建一个 GOD 角色的 Account,名为 root。

  • ADMIN:基于 Space 的高级管理员,拥有此 Space 之内的所有管理权限,但对整个集群则没有管理权限

  • DBA:数据库管理员,可以对权限内的 Space 进行管理,例如对 Schema / Data 进行修改和查询。和 ADMIN 的区别是 DBA 不能对某个 Account 进行授权操作,但 ADMIN 可以

  • USER:普通的数据库使用角色。可读写 Data,可读 Schema 但没有写权限

  • GUEST:访问者角色,对权限内 Space 的 Schema 和 Data 有只读权限

详细权限列表如下图所示:

OPERATIONGODADMINDBAUSERGUEST
Read SpaceYYYYY
Write SpaceY



Read SchemaYYYYY
Write SchemaYYY

Write UserY



Write RoleYY


Read DataYYYYY
Write DataYYYY
Special operationYYYYY

注 : Special Operation 为特殊操作,例如 SHOW SPACE,每个角色都可以执行,但其执行结果只显示 Account 权限内的结果。

数据库操作权限细分

基于上边的角色列表,不同的角色拥有不同的操作许可,详细如下:

OPERATIONSTATEMENTS
Read Space1. USE
2. DESCRIBE SPACE
Write Space1. CREATE SPACE  
2. DROP SPACE
3. CREATE SNAPSHOT
4. DROP SNAPSHOT
5. BALANCE
Read Schema1. DESCRIBE TAG
2. DESCRIBE EDGE
3. DESCRIBE TAG INDEX
4. DESCRIBE EDGE INDEX
Write Schema1. CREATE TAG
2. ALTER TAG
3. CREATE EDGE
4. ALTER EDGE
5. DROP TAG
6. DROP EDGE
7. CREATE TAG INDEX
8. CREATE EDGE INDEX
9. DROP TAG INDEX
10. DROP EDGE INDEX
Write User1. CREATE USER
2. DROP USER
3. ALTER USER
Write Role1. GRANT
2. REVOKE
Read Data1. GO
2. PIPE
3. LOOKUP
4. YIELD
5. ORDER BY
6. FETCH VERTEX
7. FETCH EDGE
8. FIND PATH
9. LIMIT
10. GROUP BY
11. RETURN
Write Data1. REBUILD TAG INDEX
2. REBUILD EDGE INDEX
3. INSERT VERTEX
4. UPDATE VERTEX
5. INSERT EDGE
6. UPDATE DEGE
7. DELETE VERTEX
8. DELETE EDGE
Special Operation1. SHOW,eg: SHOW SPACE、 SHOW ROLES
2. CHANGE PASSWord

控制逻辑

图数据库Nebula Graph访问控制实现原理是什么

Nebula Graph 的用户管理和权限管理和大多数数据库的控制相似,基于 meta server,对图空间(Space)、角色(Role)、操作(Operation)三个层面进行权限管理,当 Client 连接 Nebula Graph Server 的时候,Nebula Graph Server 首先会验证登陆账户(Account)是否存在,并验证密码是否有效。

登录成功后,Nebula Graph Server 会为此连接初始 Session ID,并将 Session ID、用户信息、权限信息和 Space 信息一起加载到 Session 结构中。后续的每次操作将基于 Session 结构中的信息进行权限判断。直到用户主动退出连接或 session timeout,Session 销毁。另外,Meta Client 对权限信息进行了缓存,并根据设置的时间频率进行缓存同步,有效降低了用户连接的过程的时间耗费。

控制逻辑代码片段

Permission Check
bool PermissionCheck::permissionCheck(session::Session *session, Sentence* sentence) {
    auto kind = sentence->kind();
    switch (kind) {
        case Sentence::Kind::kUnknown : {
            return false;
        }
        case Sentence::Kind::kUse :
        case Sentence::Kind::kDescribeSpace : {
            
            return true;
        }
        ...
Permission Check Entry
Status SequentialExecutor::prepare() {
    for (auto i = 0U; i < sentences_->sentences_.size(); i++) {
        auto *sentence = sentences_->sentences_[i].get();
        auto executor = makeExecutor(sentence);
        if (FLAGS_enable_authorize) {
            auto *session = executor->ectx()->rctx()->session();
            
            if (!PermissionCheck::permissionCheck(session, sentence)) {
                return Status::PermissionError("Permission denied");
            }
        }
   ...
}

示例

查看现有用户角色

(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root    |
-----------
Got 1 rows (Time spent: 426.351/433.756 ms)

创建用户

(root@127.0.0.1:6999) [(none)]> CREATE USER user1 WITH PASSWORD "pwd1"
Execution succeeded (Time spent: 194.471/201.007 ms)
(root@127.0.0.1:6999) [(none)]> CREATE USER user2 WITH PASSWORD "pwd2"
Execution succeeded (Time spent: 33.627/40.084 ms)
# 查看现有用户角色
(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root    |
-----------
| user1   |
-----------
| user2   |
-----------
Got 3 rows (Time spent: 24.415/32.173 ms)

为 Space 中的不同 Account 指定角色

# 创建图空间
(root@127.0.0.1:6999) [(none)]> CREATE SPACE user_space(partition_num=1, replica_factor=1)
Execution succeeded (Time spent: 218.846/225.075 ms)
(root@127.0.0.1:6999) [(none)]> GRANT DBA ON user_space TO user1
Execution succeeded (Time spent: 203.922/210.957 ms)
(root@127.0.0.1:6999) [(none)]> GRANT ADMIN ON user_space TO user2
Execution succeeded (Time spent: 36.384/49.296 ms)

查看特定 Space 的已有角色

(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
=======================
| Account | Role Type |
=======================
| user1   | DBA       |
-----------------------
| user2   | ADMIN     |
-----------------------
Got 2 rows (Time spent: 18.637/29.91 ms)

取消特定 Space 的角色授权

(root@127.0.0.1:6999) [(none)]> REVOKE ROLE DBA ON user_space FROM user1
Execution succeeded (Time spent: 201.924/216.232 ms)
# 查看取消之后,user_space 现有角色
(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
=======================
| Account | Role Type |
=======================
| user2   | ADMIN     |
-----------------------
Got 1 rows (Time spent: 16.645/32.784 ms)

删除某个 Account 角色

(root@127.0.0.1:6999) [(none)]> DROP USER user2
Execution succeeded (Time spent: 203.396/216.346 ms)
# 查看 user2 在 user_space 的角色
(root@127.0.0.1:6999) [(none)]> SHOW ROLES IN user_space
Empty set (Time spent: 20.614/34.905 ms)
# 查看数据库现有 account
(root@127.0.0.1:6999) [(none)]> SHOW USERS;
===========
| Account |
===========
| root    |
-----------
| user1   |
-----------
Got 2 rows (Time spent: 22.692/38.138 ms)

上述就是小编为大家分享的图数据库Nebula Graph访问控制实现原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 图数据库Nebula Graph访问控制实现原理是什么

本文链接: https://www.lsjlt.com/news/69974.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-15
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-15
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-15
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-15
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-15
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-15
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-15
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-15
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作