首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:限制每个用户对记录子集的访问

问MySQL:限制每个用户对记录子集的访问
EN

Stack Overflow用户
提问于 2014-03-21 11:55:24
回答 1查看 4.1K关注 0票数 5

我们使用的几个表大致如下:

代码语言:javascript
复制
| ID  | DepartmentId | Data |
| 1   | 1            | ...  |
| 2   | 1            | ...  |
| 3   | 2            | ...  |
| 4   | 3            | ...  |
| 5   | 2            | ...  |

我们有大约200个MySQL用户,每个用户都与一个或多个部门相关联(通过一个简单的用户名/DepartmentId表)--我们希望将访问(SELECT、UPDATE)限制在每个用户的记录的正确子集上。

例如,

代码语言:javascript
复制
SELECT * FROM DataTable

与部门1和3相关联的用户"Bob“应返回记录1、2和4。与部门1关联的用户"Alice”的相同查询只应返回记录1和2。

实现这一目标的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-21 12:02:00

MySQL没有基于行的权限。最好的方法是构造视图来显示某些记录。一个简单的方法是将一个带有mysql用户名的映射表添加到部门id中,他们可以访问这个部门id,并将该映射表上的视图select连接到原始表,其中仅限于当前请求的用户。您可以使用CURRENT_USER()获取当前mysql用户。

然后将用户限制为视图,而不是原始表。

以下是这些步骤的细目:

代码语言:javascript
复制
   CREATE TABLE `mysqluser_dept` (
     `mysqluser` varchar(255) NOT NULL DEFAULT '',
     `DepartmentId` int(11) NOT NULL DEFAULT '0',
       PRIMARY KEY (`mysqluser`,`DepartmentId`)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE SQL SECURITY INVOKER VIEW filtered_view AS 
           SELECT o.* FROM original_table o 
               JOIN mysqluser_dept m on m.DepartmentId = o.DepartmentId
                    WHERE m.mysqluser = current_user() GROUP by o.id;

如果不想显示原始表的所有列,则可以根据需要将视图中的select o.*限制为特定的字段集。现在,根据需要填充mysqluser到departmet列的映射表。当前用户返回确切的用户,所以使用完整的用户字符串( username@localhost,username@%等)或更改视图以在比较中切断主机。

现在,用户可以访问filtered_view,并且只能按部门查看它们可以访问的行。奖励:因为这是多对多的,如果需要的话,可以让多个部门的人员--按原表主键的组--避免重复记录。

您可能还希望锁定对映射表mysqluser_department的权限。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22558081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档