首页 > 解决方案 > 如何设计数据库以记录特定的查看和编辑权限(在 Laravel 中)?

问题描述

我正在使用 Laravel 框架,并希望拥有 3 个具有关系的数据库模型:

User M:N UserGroup
UserGroup 1:N GroupEntity

问题是 - 在范围内UserGroup- 我希望有User特定的权限来查看编辑特定GroupEntity的。

到目前为止我已经阅读和思考的内容:

1)
创建 user_entity_rights( int id, int group_id, int user_id, int entity_id, boolean can_view, boolean can_edit)

表,我会将每行的权限行列入白名单。我看到的问题是,这可能会导致大量所需的数据库行。

2)
GroupEntity表中,创建JSON 列,editable_byviewable_by在其中存储用户 ID 数组。
这是一个更简单的解决方案,但由于 ID 不直接存储在数据库列中,因此可能存在巨大的性能问题。


请注意,我希望CRUD操作经常发生在权限上。
此外,无法通过某些静态角色来预测实际的数据库数据绑定或预先分组用户 - 在这些术语中,我希望这些关系是完全“随机的”。

所以我的问题:

标签: sqlsql-serverlaravel

解决方案


您可以制作几个额外的查找表。IE:

EntityGroup_ViewableBy

EntityGroup_EditableBy

您的应用程序可以在给定用户的每个会话开始时点击一次,并将列表保存在内存中。即使您的用户拥有数百个实体组的权限,整数列表也不会占用太多内存。

这些表最终可能有很多行,但相对于其余数据而言,两列整数仍然很小,如​​果您在每个会话中为每个用户查询一次它们,对性能几乎没有影响。

即使您不喜欢这种方法,我也建议您避免将值集合存储在单个数据库字段中。在几乎任何现实世界的应用程序中,查找表都使每个级别(应用程序开发、数据库管理、数据库报告等)的管理和查询变得更加容易,您认为通过将一些分隔集合塞入一个单列,向我表明值的数量不会很大。省去一些麻烦,使用查找。


推荐阅读