多租户系统的授权规则-Google云平台

2020-05-03 22:39:58

我们早些时候已经讨论了一些流行用例的编写许可规则。在这篇文章中,我们将研究为多租户系统编写权限规则。

如果您的用例不需要每个租户角色(即不需要上面的第2点),那么看一下这个要点以获得更简单的实现。我们将根据Google Cloud Platform(GCP)基于角色的访问控制系统中预定义的角色来松散地发布这篇文章。GCP的基于角色的访问控制系统是一个有趣的用例,因为它不仅是多租户的,而且每个租户内的角色也是分层的。

在GCP中,每种资源类型都有与其关联的角色。例如:通过STORAGE_ADMIN、STORAGE_EDITOR、STORAGE_VIEWER角色控制对Google云存储存储桶的访问。类似地,角色COMPUTE_ADMIN、COMPUTE_EDITOR、COMPUTE_VIEWER等控制对计算引擎的访问。

角色也可以针对每个资源。例如:每个存储桶都有一个与其相关联的storage_admin、storage_edit、storage_viewer角色。因此,给定存储桶的storage_viewer只能访问该存储桶,但具有全局storage_viewer角色的用户可以查看任何存储桶。

全局角色和按资源角色都是分层的,即存储管理员可以执行存储编辑可以执行的任何操作,依此类推。

最后,每个角色都是针对每个项目的,因此用户可以在一个项目中是storage_admin,而在另一个项目中是storage_edit。

我们已经创建了Projects表和Users表,以跟踪系统中的项目和用户。角色表包含所有角色的列表以及层次结构信息。USER_PROJECT_ROLES将用户映射到他们在项目中的角色,而USER_BACKET_ROLES将用户映射到给定存储桶中的角色。

我们还假设我们已经创建了从storage_bucket到user_bucket_Roles的一对一关系USER_BACKET_ROLES。请注意,按照通用约定,关系和目标表具有相同的名称。

注意:虽然GCP有很多资源,但在上面的模式中,我们只包含了STORAGE_BUCKETS表。我们将研究如何编写此表的权限规则。其他表的权限规则将类似。

在实践中创建一个Storage Bucket可能会涉及多个服务之间的协调、分配空间等。本帖子的目标只是解释如何实现一个类似于GCP的基于角色的访问控制系统。因此,我们将很方便地忽略这些复杂性。

与前一篇文章中的示例3类似,我们将使用下面的要点将USER_PROJECT_ROLES和USER_BACKET_ROLES展平为FLATEED_USER_PROJECT_ROLES和FLATEED_USER_BOCK_ROLE。这使我们不必担心角色的层次结构。

例如,如果在USER_PROJECT_RULES表中为用户分配了STORAGE_ADMIN角色,则FLATEED_USER_PROJECT_ROLES将有3行为其分配:storage_admin、storage_Editor和storage_viewer。

由于我们已经对数据库中的角色进行了建模,因此我们将使用Hasura中名为User的单个角色来定义权限规则。我们假设会话变量X-Hasura-User-ID包含user_id,X-Hasura-Project-ID包含用户试图访问的项目。

STORAGE_BUKETS上的权限规则如果用户在给定存储桶上具有STORAGE_VIEWER角色或具有全局STORAGE_VIEWER角色,则可以查看STORAGE_BUKET。

{";_AND";:[{";_EXISTS";:{";_TABLE";:{";SCHEMA";:";PUBLIC";,";名称";:";FLATEED_USER_PROJECT_ROLES";},";_WHERE";:{";_AND";:[{";user_id";:{";_eq";:";X-hasura-user-id";}},{";角色id";:{";_eq";:";storage_viewer";}},{";project_id";:{";_eq";:";X-Hasura-Project-ID";}}]},{";project_id";:{";_eq";:";X-Hasura-Project-ID";}}]}。

上面的JSON使用_EXISTS运算符检查fltened_user_project_Roles中是否存在具有给定角色、project_id和user_id的行。

{";USER_Bucket_Roles";:{";_and";:[{";user_id";:{";_eq";:";X-Hasura-User-ID";}},{";Role_id";:{";_eq";:";storage_viewer";}}]}。

在上面的规则中,USER_BACKET_ROLES是STORAGE_BUCKTS和USER_BACKET_ROLES之间的多对多关系。Hasura通过获取当前行的USER_BUTCH_ROLES并验证USER_ID和ROLE_ID是否等于给定值来评估规则。

{";_or";:[{";_and";:[{";_EXISTS";:{";_table";:{";schema";:";public";,";名称";:";扁平化_USER_PROJECT_ROLES";},";_WHERE";:{";_and";:[{";user_id";:{";_eq";:";X-Hasura-User-ID";}},{";Role_id";:{";_eq";:";storage_viewer";}},{";project_id";:{";_eq";:";X-Hasura-Project-ID";}}]},{";project_id";:.。

更新