我正在尝试为一个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;
这会有用的,但我想知道是否有一个更好的更有条理的方式去做这件事。我觉得在这个模型中,拥有相同权限的多个组之间会有很多冗余。
暂无答案!
目前还没有任何答案,快来回答吧!