首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL -对象权限的结构

MySQL -对象权限的结构
EN

Stack Overflow用户
提问于 2010-06-13 18:39:27
回答 1查看 990关注 0票数 2

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

我看到了许多关于一般权限的相关文章,或者用户可以访问哪些部分,这些部分包括usersuserGroupsuserGroupRelations或类似的内容。

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

代码语言:javascript
运行
复制
Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

每个组可以包含一组密码。用户可以获得对任何组的读、写、编辑和删除权限。可以在任何时间点创建更多的组。

如果有人拥有对某个组的权限,我应该能够使他对所有子组都有权限,或者将其限制在该组中。

我目前的想法是拥有一个users表,然后是一个具有如下列的权限表:

代码语言:javascript
运行
复制
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)

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

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

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

编辑

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-14 02:05:39

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

你可以考虑增加一个许可--授予。对对象具有授予权限的用户将能够将访问权限授予有关对象的其他用户。

小心“需要快速扩展”。如果没有真实的生产经验,很难猜测一个规模扩大的系统到底需要什么。

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

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

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

  1. 对具有次对象的对象的授予隐式只授予对象对该对象的访问权,或者。
  2. 还授予对所有子对象的访问权限.

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

第二种选择使确定用户是否有访问特定对象的权限变得更加困难,因为在验证用户是否具有访问权限时,您必须将对象层次结构沿着对象层次结构向树的根处搜索父对象的访问权限。绩效问题应该在你的决策中占据主导地位。您的用户会创建几个对象并经常访问它们吗?或者他们会创建许多对象和子对象,并且很少访问它们吗?如果访问比创建更频繁,则需要第一选择。在对象创建时使用权限授予开销,而不是在对象访问时使用权限搜索命中。

我认为第一选择可能更好。我建议这张桌子的布局:

代码语言:javascript
运行
复制
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.

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

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3033431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档