在你回答“使用current_user()”,这对许多情况确实有效,或者“使用user()”,但实际上并不起作用之前,请阅读以下内容...
我试图在一个表上创建一个视图,该视图限制用户访问表中的某些行,受从用户连接的IP地址控制。
我的第一次尝试看起来像这样:
现在的理论是我应该能够从主机192.168.3.30以testuser身份登录,并执行像
我试图在一个表上创建一个视图,该视图限制用户访问表中的某些行,受从用户连接的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(或Ruby、perl或其他语言)中获取IP地址在这种情况下并不有用。我正在设置一些数据库安全性,所以仅依赖客户端显然是不够的。我需要在SQL中使用IP地址。对于那些寻找想法/参考/背景的人:可以参考这里获得有关此巧妙安全技巧的灵感,但是他们使用用户名而不是IP地址,这会使此方法更加容易。在我的情况下,我正在尝试设置一个主机数据库,它部分地由主机自身更新。我不想为每个主机设置不同的用户,但我确实希望每个主机能够更新自己的记录(例如文件系统、风扇速度、温度等)。