代码之家  ›  专栏  ›  技术社区  ›  Kerry Jones

MySQL-对象权限结构

  •  2
  • Kerry Jones  · 技术社区  · 14 年前

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

    我看到过许多关于一般权限或用户可以访问的部分的相关文章,这些部分包括 users userGroups userGroupRelations 或者类似的东西。

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

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

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

    如果某人对某个组有权限,我应该能够使他对所有子组都有权限,或者仅对该组有权限。

    我目前的想法是先有一个users表,然后是一个permissions表,其中包含如下列:

    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)
    

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


    编辑

    1 回复  |  直到 14 年前
        1
  •  2
  •   O. Jones    14 年前

    我建议您添加一个“last\u update”时间戳和一个“last\u updated\u by\u user”列,这样您就有希望在运行系统中跟踪此表的更改。

    注意“需要快速扩展”。如果没有实际的生产经验,很难猜测扩展后的系统真正需要什么。

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

    您的模式似乎将用户与对象相关联。是否希望主键和唯一索引为(用户id、对象id)?也就是说,您希望每个用户对每个对象都有零个或一个权限条目吗?如果是这样,请使用主键来强制执行,而不是使用您建议的代理权限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