Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-对象权限的结构_Sql_Table Structure_Mysql - Fatal编程技术网

MySQL-对象权限的结构

MySQL-对象权限的结构,sql,table-structure,mysql,Sql,Table Structure,Mysql,用户>对象权限的理想结构是什么 我看过很多关于一般权限或用户可以访问的部分的相关文章,这些部分包括用户、用户组和用户组关系或类似性质的内容 在我的系统中,可以创建许多不同的对象,每个对象都必须能够打开或关闭。例如,以具有组和子组的密码管理器为例 Group 1 Group 2 Group 3 Group 4 Group 5 Group 6 Group 7 Group 8 Group 9 Group 10 每个组可以包含一组密码。用

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

我看过很多关于一般权限或用户可以访问的部分的相关文章,这些部分包括
用户
用户组
用户组关系
或类似性质的内容

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

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)
这在过去是有效的,但我正在构建的新系统需要能够快速扩展,我不确定这是否是最好的结构。这也使得拥有一个组的所有子组权限的人变得更加困难

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

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


编辑

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

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

<>你可以考虑添加一个权限--Grand。拥有对象授予权限的用户将能够向其他用户授予对该对象的访问权限

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

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

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

对于存在于层次结构中的对象,应在系统范围内选择以下两个选项之一:

  • 授予具有子对象的对象的权限 隐式地仅授予对 对象,或

  • 它还允许访问 到所有子对象

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

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

    我认为第一选择可能更优越。我建议采用以下表格布局:

    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
    

    @奥利——非常感谢你。
    type
    列用于确定对象类型,它将有助于将
    object\u id
    匹配到单独表中的主键。
    管理员
    权限类型与您的
    授权
    相同。我还不知道可以在同一个主键中创建多个列(由于我缺乏正式培训),我认为这是一个更好的主意。你所说的一切都暗示第一个会更好,我唯一的问题是:多个用户可以访问同一个对象。如果创建了新对象,我是否必须扫描用户以应用新权限?是的,您的对象创建规程将要求您为每个用户为每个新对象添加权限行。请注意,许多这样的系统都具有全局默认权限设置。例如,您可以进行设置,使权限表中没有ID的任何用户都具有读取权限,而没有其他权限。同上,创建对象的用户将读取/编辑/删除,而没有其他操作。(我不确定写入和编辑之间的区别。对于一个尚未创建的对象来说,很难拥有特权,除非写入特权意味着创建子对象。)哈哈,是的,它确实意味着创建子对象,再次感谢你,我希望我能给你更多的+1,这非常有帮助