【问题标题】:MySQL - Structure for Permissions to ObjectsMySQL - 对象权限的结构
【发布时间】:2011-03-03 06:48:26
【问题描述】:

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

我看过很多关于一般权限的相关帖子,或者用户可以访问哪些部分,其中包括 usersuserGroupsuserGroupRelations 或类似性质的内容。

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

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)

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

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

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


编辑

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

【问题讨论】:

    标签: sql table-structure mysql


    【解决方案1】:

    我建议您添加一个“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
    

    【讨论】:

    • @Ollie -- 非常感谢。 type 列用于确定对象类型,它将帮助将object_id 与单独表中的主键匹配。 admin 权限类型与您的 grant 相同。我也不知道您可以在同一个 primary_key 中创建多个列(由于我缺乏正式培训),我认为这是一个更好的主意。你所说的一切都暗示第一个会更好,我唯一的问题是:多个用户可以访问同一个对象。如果创建了新对象,我是否必须扫描用户才能应用新权限?
    • 是的,您的对象创建规则将要求您为每个新对象的每个用户添加权限行。请注意,许多像这样的系统都有全局默认权限设置。例如,您可以进行设置,以便其 ID 未出现在权限表中的任何用户都将拥有 READ 权限,但没有其他权限。同上,创建对象的用户将拥有 READ/EDIT/DELETE 而没有别的。 (我不确定 WRITE 和 EDIT 之间的区别。尚未创建的对象很难拥有特权,除非 WRITE 特权意味着 CREATE SUBOBJECT。)
    • 哈哈,是的,它确实意味着 CREATE SUBOJECT,再次感谢你,我希望我能给你更多的 +1,这对你有很大帮助
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多