SURSEALDB-多租户角色和许可系统的结构数据
#编程 #教程 #database #体系结构

让我们深入了解我们要创建的目标。

我们的目标是开发一个多功能平台,多个租户和用户可以无缝共处。
为了说明,请考虑我们在此平台上的最初租户集:汽车爱好者,猫主人和音乐家。

这是有趣的地方:
一个用户可以同时成为其中一个或多个租户的成员。
这意味着一个用户可能会自豪地戴着猫主和汽车爱好者的帽子,而另一个用户可能同样对音乐和汽车充满热情。
此外,在每个租户中,用户可以持有不同的权限。
例如,用户可能会喜欢在汽车爱好者领域中的完整阅读和写入访问,但可能只有在音乐家的领域中拥有读取特权。
为了简化权限管理,我们将将其组织成用户角色。
我们还希望能够单独为每个租户创建用户角色。

定义基本数据表

让我们将基础数据结构转换为超级Ql。
虽然SustrealQl通常不需要明确的表定义,但是这样做可以增强我们对过程的理解。
此外,我们将将模式定义纳入线条以增强数据完整性。

-- Define the user table
DEFINE TABLE user SCHEMALESS;

-- Define the tenant table
DEFINE TABLE tenant SCHEMALESS;

-- Define the permission table
DEFINE TABLE permission SCHEMALESS;

-- Define the role table
DEFINE TABLE role SCHEMALESS;

插入许可

在我们的教程中,我们将拥有权限创建,阅读,更新和删除。
插入数据类似于常规SQL。您可以使用koude0语句或sursealdB语句koude1

-- insert the create permission
CREATE permission:create SET name = 'create content';

-- insert the read permission
CREATE permission:read SET name = 'read content';

-- insert the update permission
CREATE permission:update SET name = 'update content';

-- insert the delete permission
CREATE permission:delete SET name = 'delete content';

插入角色

创建角色本身类似于创建许可。但是,在这种情况下,我们还旨在将角色与权限联系起来。
SurseAldB提供了koude2声明。这将带来一整套的图形功能。

-- insert the reader role
CREATE role:reader SET name = 'Content Reader';

-- create a relation from role reader to read permission
RELATE role:reader->role_permission->permission:read;

我们将在称为cole_permission的表中跟踪角色和权限之间的关系。该表有两个基本字段:内外。
将该表中的数据视为存储的路线图作为有向图。
在我们的示例中,这种联系从角色到权限。
请记住此细节,因为当我们以后检索数据时,它将变得至关重要。

有了这些知识,我们可以添加更多的角色。

-- insert the creator role
CREATE role:author SET name = 'Content Author';

-- create a relation from role author to permissions
RELATE role:author->role_permission->permission:read;
RELATE role:author->role_permission->permission:create;
RELATE role:author->role_permission->permission:update;
-- insert the admin role
CREATE role:admin SET name = 'Administrator';

-- create a relation from role admin permissions
RELATE role:admin->role_permission->permission:read;
RELATE role:admin->role_permission->permission:create;
RELATE role:admin->role_permission->permission:update;
RELATE role:admin->role_permission->permission:delete;

插入租户

正如我们现在拥有的权限和角色一样,我们现在可以创建我们的房客。
这很简单。
我们创建租户条目本身,然后将角色与特定的租户联系起来。
牢记角色到租户的方向。

-- create the tenant for our car enthusiasts
CREATE tenant:car SET name = 'Car Enthusiasts';

RELATE role:admin->tenant_role->tenant:car;
RELATE role:author->tenant_role->tenant:car;
RELATE role:reader->tenant_role->tenant:car;

-- create the tenant for our cat owners
CREATE tenant:cat SET name = 'Cat Owners';

RELATE role:admin->tenant_role->tenant:cat;
RELATE role:author->tenant_role->tenant:cat;
RELATE role:reader->tenant_role->tenant:cat;

-- create the tenant for our musicians
CREATE tenant:musician SET name = 'Musicians';

RELATE role:admin->tenant_role->tenant:musician;
RELATE role:author->tenant_role->tenant:musician;
RELATE role:reader->tenant_role->tenant:musician;

插入用户

要包装内容,让我们在数据库中添加一些用户条目。我们首先创建一个用户实体条目。默认情况下,surseAldB返回了整个新创建的条目,从而使我们能够将此结果保存在以供将来使用的变量中。

接下来,我们使用此存储的结果来建立用户与租户之间的关系。建立这种关系遵循与常规进入创建相似的过程,结果我们再次收到一个完整的实体,我们可以将其存储在另一个变量中。

最后,在最后一步中,我们建立了从用户到租户关系到角色输入的关系,完成了我们数据库中的连接。

-- create the user
LET $createdUser = (CREATE user:1 SET 
  name='John Doe',
  firstName = 'John',
  lastName = 'Doe',
  email='john.doe@example.com');

-- link the user John Doe to the tenant "car enthusiasts"
LET $memberRelation = (RELATE $createdUser->tenant_member->tenant:car);

-- link the member relationship to a role
RELATE $memberRelation->member_role->role:author;

-- finally, return the newly created user
RETURN $createdUser;

结构

这是数据结构的图表:

Data structure with relations

这是完整的代码。
您可以使用surrealist.app运行SurstealQl。

-- Define the user table
DEFINE TABLE user SCHEMALESS;

-- Define the tenant table
DEFINE TABLE tenant SCHEMALESS;

-- Define the permission table
DEFINE TABLE permission SCHEMALESS;

-- Define the role table
DEFINE TABLE role SCHEMALESS;

-- insert the create permission
CREATE permission:create SET name = 'create content';

-- insert the read permission
CREATE permission:read SET name = 'read content';

-- insert the update permission
CREATE permission:update SET name = 'update content';

-- insert the delete permission
CREATE permission:delete SET name = 'delete content';

-- insert the reader role
CREATE role:reader SET name = 'Content Reader';

-- create a relation from role reader to read permission
RELATE role:reader->role_permission->permission:read;

-- insert the creator role
CREATE role:author SET name = 'Content Author';

-- create a relation from role author to permissions
RELATE role:author->role_permission->permission:read;
RELATE role:author->role_permission->permission:create;
RELATE role:author->role_permission->permission:update;

-- insert the admin role
CREATE role:admin SET name = 'Administrator';

-- create a relation from role admin permissions
RELATE role:admin->role_permission->permission:read;
RELATE role:admin->role_permission->permission:create;
RELATE role:admin->role_permission->permission:update;
RELATE role:admin->role_permission->permission:delete;

-- create the tenant for our car enthusiasts
CREATE tenant:car SET name = 'Car Enthusiasts';

RELATE role:admin->tenant_role->tenant:car;
RELATE role:author->tenant_role->tenant:car;
RELATE role:reader->tenant_role->tenant:car;

-- create the tenant for our cat owners
CREATE tenant:cat SET name = 'Cat Owners';

RELATE role:admin->tenant_role->tenant:cat;
RELATE role:author->tenant_role->tenant:cat;
RELATE role:reader->tenant_role->tenant:cat;

-- create the tenant for our musicians
CREATE tenant:musician SET name = 'Musicians';

RELATE role:admin->tenant_role->tenant:musician;
RELATE role:author->tenant_role->tenant:musician;
RELATE role:reader->tenant_role->tenant:musician;

-- create the user
LET $createdUser = (CREATE user:1 SET 
  name='John Doe',
  firstName = 'John',
  lastName = 'Doe',
  email='john.doe@example.com');

-- link the user John Doe to the tenant "car enthusiasts"
LET $memberRelation = (RELATE $createdUser->tenant_member->tenant:car);

-- link the member relationship to a role
RELATE $memberRelation->member_role->role:author;

-- finally, return the newly created user
RETURN $createdUser;

我们现在有一个名为“约翰·杜”(John Doe)的用户,他是“汽车爱好者”租户的成员。他被任命为“作者”的角色,该角色赋予他“读取”,“创建”和“更新”的权限。

在本教程的下一部分中,我们将仔细研究如何访问此信息。