我们正在使用几张大致如下所示的表:
| ID | DepartmentId | Data |
| 1 | 1 | ... |
| 2 | 1 | ... |
| 3 | 2 | ... |
| 4 | 3 | ... |
| 5 | 2 | ... |
我们大约有200个MySQL用户,每个用户都与一个或多个部门关联(通过一个简单的Username / DepartmentId表)
我们希望将访问(SELECT,UPDATE)限制为仅对每个用户正确的记录子集.
例如,一个
SELECT * FROM DataTable
与部门1和3关联的用户“ Bob”应返回记录1、2和4.
与部门1相关联的用户“ Alice”的同一查询应仅返回记录1和2.
做到这一点的最佳方法是什么?
解决方法:
MySQL没有基于行的权限.最好的办法是构造视图以显示某些记录.一种简单的方法是将一个具有mysql用户名的映射表添加到他们有权访问的部门ID上,并让该映射表上的视图选择与原始视图(仅限于当前发出请求的用户)结合在一起.您可以使用CURRENT_USER()获取当前的mysql用户.
然后将用户限制为视图,而不是原始表.
以下是步骤的细分:
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 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.*限制为一组特定的字段.现在,根据需要将mysqlusers的映射表填充到departmet列.当前用户返回确切的用户,因此请使用完整的用户字符串(username @ localhost,username @%等)或更改视图以将主机砍掉进行比较.
现在,用户可以访问filtered_view,并且只能按部门查看他们有权访问的行.奖励:由于这是多对多的,因此您可以根据需要在多个部门中拥有人员-在原始表的主键上进行分组可以避免重复记录.
您可能还希望锁定对映射表mysqluser_department的权限.
标签:records,limit,mysql 来源: https://codeday.me/bug/20191121/2055795.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。