用于用户和组访问控制的MySQL数据库模式

用于用户和组访问控制的MySQL数据库模式,mysql,access-control,Mysql,Access Control,几天来,我一直在试图找到解决这个问题的方法,但我似乎找不到有效的方法。问题如下: 我目前正在开发一个统计工具,它显示了一些应用程序的图表和数据。显然需要限制对这些数据的访问,因为用户A拥有应用程序“一”和“二”,并且不能看到“三”或“四” 现在,每个用户都可以是多个组的成员并从该组继承权限,但也可以拥有单独的权限。必须为每个应用程序设置这些权限。如果满足以下条件,则允许访问一个应用程序的一组数据: 用户本人有权访问此应用程序的这段数据 用户所属的任何一个组都有权访问此应用程序的这段数据 目

几天来,我一直在试图找到解决这个问题的方法,但我似乎找不到有效的方法。问题如下:

我目前正在开发一个统计工具,它显示了一些应用程序的图表和数据。显然需要限制对这些数据的访问,因为用户A拥有应用程序“一”和“二”,并且不能看到“三”或“四”

现在,每个用户都可以是多个组的成员并从该组继承权限,但也可以拥有单独的权限。必须为每个应用程序设置这些权限。如果满足以下条件,则允许访问一个应用程序的一组数据:

  • 用户本人有权访问此应用程序的这段数据
  • 用户所属的任何一个组都有权访问此应用程序的这段数据

目标是创建一个表,存储每个用户当前对每个应用程序的实际权限,这些权限是根据组成员身份和个人权限计算的,并且由于与其他表的关系,这些信息始终保持一致

我不知道这是否有助于找到解决方案,但以下是获取id为1的用户当前活动权限的SQL:

(
SELECT u.perm_id AS perm, u.user_id AS uid, u.app_id AS app
FROM daUsers_has_daPermissions AS u
WHERE u.user_id = 1
)
UNION
(
SELECT g.perm_id AS perm, u.user_id AS uid, g.app_id AS app
FROM daUsers_has_daPermissions AS u, daUsergroup_has_daPermissions AS g, daUsergroup_has_daUsers AS g_has_u
WHERE u.user_id = 1
AND u.user_id = g_has_u.user_id
AND g.group_id = g_has_u.group_id
);

这就是我想要存储在额外表中的内容(仅适用于所有用户)。

我觉得您应该使用视图。您已经有了查询,请使用该查询创建视图

谢谢你的提示,直到现在我才知道什么是风景。我将暂时这样做,但这并不能真正解决我的问题,因为每当有人向视图请求数据时,视图也会从每个相关表收集所有数据,这正是我想要避免的。我想将该信息存储在一个表中,并且仅当对某些影响权限的内容(如删除的组)进行了实际更改时才更新该信息。然后,您可以使用触发器。更新影响权限的表时。让触发器更新存储所有权限的表。您需要的是一个实体化视图,这是MySQL中不存在的功能。但是,您可以通过定义一个新表,并使用触发器来确保它被准确地填充。