什么是用户>对象权限的理想结构。

我看过许多有关一般权限或用户可以访问哪些部分的相关帖子,其中包括 users, userGroupsuserGroupRelations 或类似性质的东西。

在我的系统中,可以创建许多不同的对象,并且每个对象都必须能够打开或关闭。例如,采用具有组和子组的密码管理器。

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

每个组可以包含一组密码。用户可以被授予对任何组的读、写、编辑和删除权限。可以随时创建更多组。

如果某人拥有某个组的权限,我应该能够让他拥有所有子组的权限或将其限制为仅该组。

我目前的想法是拥有一个用户表,然后是一个权限表,其中包含以下列:

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

这在过去是有效的,但我正在构建的新系统需要能够快速扩展,我不确定这是否是最好的结构。这也使得让某人拥有一个组的所有子组权限的想法变得更加困难。

用户/管理员的角色将有一个单独的表,这意味着他们可以更改他们可以控制的组下面的用户的权限。

那么,作为一个问题,我应该使用上面的结构吗?或者有人可以指出我更好的方向吗?


编辑

另一种方法是为每种类型的对象创建一个权限表。

有帮助吗?

解决方案

我建议您添加“last_update”时间戳和“last_updated_by_user”列,以便您有希望跟踪正在运行的系统中对此表的更改。

您可以考虑添加一个权限——授予。具有对象授予权限的用户将能够向其他用户授予对相关对象的访问权限。

小心 "需要快速扩展"。 在没有实际生产经验的情况下,很难猜测一个规模更大的系统到底需要什么。

另外,请注意不要使权限系统过于复杂,因为过于复杂的系统将难以验证,因此更容易被破解。一个简单的系统比一个更复杂的系统更容易重构以进行扩展。

您的架构似乎将用户与对象联系起来。您希望主键和唯一索引为(user_id,object_id)吗?也就是说,您希望每个用户对每个对象拥有零个还是一个权限条目?如果是这样,请使用主键来强制执行,而不是使用您建议的代理permission_id 键。

对于存在于层次结构中的对象,您应该在系统范围内做出以下两种选择之一:

  1. 授予包含子对象的对象 隐式地只允许访问 对象,或

  2. 它还允许 到所有子对象。

第二种选择减少了创建新子对象时显式授予权限的负担。第一个选择比较安全。

第二种选择使得确定用户是否有权访问特定对象变得更加困难,因为在验证用户是否有权访问时,您必须将对象层次结构向树的根部查找父对象的访问授权。该性能问题应该主导您的决策。您的用户会创建一些对象并经常访问它们吗?或者他们会创建许多对象和子对象并且很少访问它们?如果访问比创建更频繁,那么您需要第一个选择。在对象创建时获取权限授予开销,而不是在对象访问时获取权限搜索开销。

我认为第一个选择可能更好。我建议这个表格布局:

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

您还可以使用此表布局,并在表中为每个对象授予每个用户的每个不同权限设置一行。如果您添加更多类型的权限,这一扩展会更容易。

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top