仅向用户提供GRANT EXECUTE'过程'(无select或插入权限)

我想知道是否有可能授予EXECUTE权限的用户没有授予的过程上运行的表上的SELECTINSERT等权限?

将它用于webapp的login表。 MySQL正在Docker容器中运行。 用于创build过程的SQL作为docker构build过程的一部分进行复制(运行时,sql在entrypoint.sh中使用)。 运行容器(-e标志)时创buildLogin_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; 

这不能解决它 – 因为表所有者会暴露相同的权限:

由于表权限,执行存储的proc失败并执行GRANT EXECUTE

这可能可以解释为什么我不能,但表名有点奇怪(MySQL新手 – 我的印象是mysql.proc是一个系统表,所以不知道它是否适用):

如何将特定存储过程的执行权授予用户

难道是根在创build过程时没有SELECT权限,所以login用户无法运行它? (因为Docker MySQL运行的是entrypoint.sh,然后是环境variables)?

程序代码在这里(我知道,不是最优雅的) – 我可以授予,然后REVOKE权限的logins用户在此,考虑到DEFINER是根?

 CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_login16`( IN p_email VARCHAR(120), IN p_password VARCHAR(120)) BEGIN SELECT user_id,user_password FROM login WHERE user_email = p_email; 

是的,您可以在声明存储过程时使用sql security definer来做到这一点:

SQL SECURITY特性可以是DEFINER或INVOKER来指定安全上下文; 也就是说,例程是使用例程DEFINER子句中指定的帐户的特权还是调用它的用户来执行。 该帐户必须具有访问与该例程相关联的数据库的权限。 默认值是DEFINER。 调用例程的用户必须具有EXECUTE特权,如果例程在定义者安全性上下文中执行,必须使用DEFINER帐户。

DEFINER子句指定在例程执行时检查具有SQL SECURITY DEFINER特性的例程的访问特权时要使用的MySQL帐户。

如果为DEFINER子句提供了一个用户值,它应该是指定为'user_name'@'host_name',CURRENT_USER或CURRENT_USER()的MySQL帐户。 DEFINER的默认值是执行CREATE PROCEDURE或CREATE FUNCTION语句的用户。 这与显式指定DEFINER = CURRENT_USER相同。

综上所述:definer子句中的用户必须具有对基础表的select / insert权限,而执行存储过程的用户必须对存储过程具有执行权限。

添加了具有SELECTINSERTUPDATE权限的新用户ADMIN@localhost 。 然后ADMIN成为所有程序的DEFINER'logins'@'172.24.0.7'只被授予EXECUTE权限。 现在运行完美!

显然你不能以我想要的方式使用root。 向@Shadow表示感谢,向我指出了正确的方向。

最后的SQL在这里:

https://github.com/dijksterhuis/Notflix/tree/master/mysql/logins/sql

Interesting Posts