2

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

我已经看到了许多有关一般权限的相关帖子,或者用户可以访问哪些部分,其中包含一个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)

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

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

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


编辑

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

4

1 回答 1

2

我建议您添加一个“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
于 2010-06-14T02:05:39.193 回答