【问题标题】:PHP, MySQL - efficiently determining access permissions based on distant parentPHP,MySQL - 基于远亲有效地确定访问权限
【发布时间】:2020-07-18 05:33:36
【问题描述】:

我正在努力想出一个有效的解决方案来确定用户对指定文件夹的访问权限,使用 PHP(特别是 Laravel)和 MySQL。我想创建一个具有 Google Drive-esque 功能的系统...

例如,Joe Bloggs 在文件夹中创建了许多文件夹,例如Level 1 > Level 2 > Level 3 > Level 4 > Level 5。在这些文件夹中的任何一个中,都可以有任意数量的附加子文件和文件夹。

这将是生成的数据库结构 -

Table name: users

| id | name       |
| -- | ---------- |
| 1  | Joe Bloggs |
| 2  | John Snow  |


Table name: folders

| id | parent_id | author_id | name      |
| -- | --------- | --------- | --------- |
| 1  | NULL      | 1         | Level 1   |
| 2  | 1         | 1         | Level 2   |
| 3  | 2         | 1         | Level 3   |
| 4  | 3         | 1         | Level 4   |
| 5  | 4         | 1         | Level 5   |
| 6  | 2         | 1         | Level 3.1 |
| 7  | 2         | 1         | Level 3.2 |

Table name: folders_users

| id | folder_id | user_id | owner | read | write |
| 1  | 1         | 1       | 1     | 1    | 1     |
| 2  | 3         | 2       | 0     | 1    | 1     |

因此,根据 folder_users 中的记录 1,Joe Bloggs 应该对 Level 1 下的所有文件夹拥有所有者、读取和写入权限。 Joe Bloggs,然后授予 John Snow 对 Level 3 的读写访问权限,这反过来又应授予 Joe Bloggs 对 Level 3Level 3.1Level 3.2 的读写访问权限以及将来在其中任何一个下创建的任何内容。

此外,用户应该可以为文件夹加注星标。我想这可以简单地通过一个单独的表来实现并单独查询 -

Table name: starred_folders

| id | folder_id | user_id |
| -- | --------- | ------- |
| 1  | 7         | 2       |

我目前的解决方案是针对用户有权访问的链中的每个文件夹,在folders_users 表中创建一条记录。我觉得这只是使事情过于复杂并创建了过多的记录。在共享文件夹时尤其如此,因为我必须为该用户重新创建整个树。或者,想象一下,如果用户撤销对其中一个共享用户的写入权限,则必须针对单个标志更新整个树(可能有数百条记录)。

生成这些树并快速有效地确定用户在任何给定文件夹中的访问级别的最佳方法是什么?我怀疑这样做的唯一方法是递归,但我担心它的效率?或者,我是否应该为此使用与 MySQL 完全不同的东西?我对图形数据库进行了简短的了解,但我认为这对我们来说不是一个前进的方向,因为我们没有支持它的基础架构。

谢谢, 克里斯。

【问题讨论】:

    标签: php mysql laravel recursion


    【解决方案1】:

    我写这篇文章是作为一种解决方案而不是最有效的解决方案。

    您可以在folders 表中添加一列(我们称之为访问权限),然后放入有权访问该文件夹及其子文件夹的人员的 ID。我假设当您想显示有关文件夹的信息时,您还必须从表中获取其父级信息,因此您无需为此添加新查询。
    如果你只有一个访问定义,你可以像user1,user2,...这样简单地将记录添加到这个列,如果没有,你可以像这样序列化一个数组

    [
        "read" => [user1,user2,...],
        "write" => [user2]
    ]
    

    当然,您可以为每个访问添加一列,但如果您有这么多访问,这也可能是一个解决方案。

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 2012-06-16
      • 2013-11-16
      • 2013-01-25
      • 2015-11-20
      • 2016-03-27
      • 2019-04-24
      • 2012-05-23
      相关资源
      最近更新 更多