在你回答“使用CURRENT_USER()”,这的确工作很多情况下,或“使用用户()”,这确实不工作,请阅读以下...
我试图创建这就限制了表中某些行的用户访问,通过从用户连接的IP地址控制表的视图。
我第一次尝试是这样的:
create table testtable (
`RowID` bigint not null auto_increment,
`owner` varchar(64),
`key` varchar(64),
`val` varchar(64),
primary key (`RowID`)
);
create view testview (
`RowID`,
`owner`,
`key`,
`val`
) as select
`testtable`.`RowID` as `RowID`,
`testtable`.`owner` as `owner`,
`testtable`.`key` as `key`,
`testtable`.`val` as `val`
from testtable
where (testtable.owner = substring_index(current_user(), '@', -1));
create user 'testuser'@'192.168.3.30' identified by 'testpass';
grant select, insert, update, delete on testview to 'testuser'@'192.168.3.30';
现在,这个理论是说我应该能够登录为来自主机192.168.3.30 testuser的和做一些像select * from testview
并获得适用于我TestTable的真子集。
上述不起作用。 它不工作的原因是, current_user()
默认返回视图的定义者 ,导致没有数据,或者(更糟糕的)错误的数据,这取决于谁定义者了。 如果我想current_user()
返回调用用户,我需要创建一个视图SQL SECURITY INVOKER
条款,这也限制了安全权限的那些调用用户,从而击败了代码的初衷。
我喜欢使用user()
但不幸的是,几乎总是返回主机名/域名,而不是IP地址。
附带说明,如果它不是明确:获得在PHP中的IP地址(或Ruby或Perl,或其他)是不是在这种情况下非常有用。 我设置了一下数据库的安全性,所以依赖于客户端明显不足。 我需要在SQL的IP地址。
对于好奇寻找创意/参考/背景:
作为参考,我从这个漂亮的安全技巧的想法在这里 ,但他们使用的用户名,而不是IP地址,这将使这更简单。 就我而言,我试图建立它的主机部分由主机本身更新的数据库。 我不想设置每个主机的不同的用户,但我希望每个主机能够更新其自己的记录(文件系统,风扇转速,温度等)。