sql—基于用户权限授予表内数据访问权限的更好方法?

lp0sw83n  于 2021-07-26  发布在  Java
关注(0)|答案(0)|浏览(228)

我正在尝试为一个api设计一个系统,该api基于与组表组相关的权限表权限授予用户对数据表数据的访问权限。当用户(从数据表)请求数据时,我的api应该仅基于数据表中允许他们查看的列中的值返回数据表中的行。
默认情况下,用户在通过我的api请求数据时将无权访问任何行。但是,我想根据列中的值授予对数据的访问权。
例如,如果我的数据表包含有关新闻文章的信息,并且有标题、新闻来源、发布日期和其他类似列

id | title    |  news_source          | posted_date | ...
-----+----------+-----------------------+-------------+------
 1   | ...      | NYTimes               | 2019-12-30  |  
 2   | ...      | BBC                   | 2019-12-30  |  
 3   | ...      | BBC                   | 2019-12-30  |
 4   | ...      | Washington Post       | 2019-12-30  |
 5   | ...      | NYTimes               | 2019-12-30  |
 6   | ...      | NYTimes               | 2020-01-01  |
 7   | ...      | Boston Globe          | 2020-01-01  |

在这个例子中,我想授予一个组访问权,只从纽约时报获取数据,发布在2020-01-01之后,等等。。。
为此,我实现了下面的模式

+-----+        +--------------+
|Group|<-------|Permission    |
+-----+        +--------------+
|name |        |group_id      |
|...  |        |column_name   |
+-----+        |text_value    |
               |date_value    |
               +--------------+

对于group,name只是组的名称,椭圆表示其他一些不相关的列。在permissions中,我有group的外键(group\u id)、我正在访问的数据表中的列的名称(column\u name)和我授予访问权限的值(text\u value或date\u value,具体取决于我引用的列)。
现在,当用户请求数据时,我运行这个sql来应用权限(如果用户的组id=1)。

SELECT * FROM Data d
    INNER JOIN Permission p1 ON p1.group_id = 1 AND p1.column_name = 'news_source' AND p1.text_value = d.news_source
    INNER JOIN Permission p2 ON p2.group_id = 1 AND p2.column_name = 'posted_date' AND p2.date_value >= d.posted_date;

这会有用的,但我想知道是否有一个更好的更有条理的方式去做这件事。我觉得在这个模型中,拥有相同权限的多个组之间会有很多冗余。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题