我想知道是否可以向用户授予EXECUTE
权限,而无需授予SELECT
,INSERT
等权限。一个程序运行?
将其用于Web应用程序的登录表。 MySQL正在Docker容器中运行。用于创建过程的SQL作为docker构建过程的一部分进行复制(运行时,在entrypoint.sh中使用sql)。运行容器(-e标志)时会创建Login_db。
我想从下方删除GRANT SELECT
行,这样无论发生什么情况,webapp服务器都无法运行SELECT
查询 - 例如执行SELECT * FROM logins
。
CREATE USER 'logins'@'172.24.0.7' IDENTIFIED BY 'some-password';
GRANT SELECT, INSERT, UPDATE on logins_db.login TO 'logins'@'172.24.0.7';
GRANT EXECUTE ON PROCEDURE logins_db.sp_login16 TO 'logins'@'172.24.0.7';
FLUSH PRIVILEGES;
这并没有解决它 - 因为表所有者会公开相同的权限:
Execute stored proc fails with GRANT EXECUTE because of table permissions
这也许可以解释我为什么不能这样做,但表名对我来说有点奇怪(MySQL新手 - 我认为mysql.proc
是一个系统表,所以不确定如果适用):
How to grant execute on specific stored procedure to user
在创建过程时root可能没有SELECT权限,因此登录用户无法运行它吗? (因为Docker MySQL运行entrypoint.sh然后运行环境变量)?
程序代码在这里(我知道,不是最优雅的) - 考虑到{{1},我可以GRANT
然后REVOKE
logins
这个用户的权限是root?
DEFINER
答案 0 :(得分:2)
是的,您可以在声明stored procedure时使用sql security definer
执行此操作:
SQL SECURITY特性可以指定DEFINER或INVOKER 安全背景;也就是说,例程是否使用 在例程DEFINER子句中指定的帐户的权限 调用它的用户。此帐户必须具有访问权限的权限 与例程关联的数据库。默认值为 DEFINER。调用例程的用户必须具有EXECUTE 如果例程执行,DEFINER帐户必须具有特权 在definer安全上下文中。
DEFINER子句指定要在何时使用的MySQL帐户 在例程执行时检查访问权限 具有SQL SECURITY DEFINER特性。
如果为DEFINER子句指定了用户值,则它应该是MySQL 帐户指定为'user_name'@'host_name',CURRENT_USER或 当前用户()。默认的DEFINER值是执行该操作的用户 CREATE PROCEDURE或CREATE FUNCTION语句。这是一样的 明确指定DEFINER = CURRENT_USER。
总结一下:definer子句中的用户必须具有对此基础表的select / insert权限,而执行存储过程的用户必须具有对存储过程的执行权限。
答案 1 :(得分:0)
添加了具有ADMIN@localhost
,SELECT
和INSERT
权限的新用户UPDATE
。 ADMIN
然后成为所有程序的DEFINER
,'logins'@'172.24.0.7'
仅被授予EXECUTE
权限。现在完美运行!
显然你不能按照我的方式使用root。感谢@Shadow指出我正确的方向。
最终SQL在这里:
https://github.com/dijksterhuis/Notflix/tree/master/mysql/logins/sql