Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅向用户授予执行“过程”(无选择或插入权限)_Mysql_Security_Stored Procedures_Docker_Grant - Fatal编程技术网

Mysql 仅向用户授予执行“过程”(无选择或插入权限)

Mysql 仅向用户授予执行“过程”(无选择或插入权限),mysql,security,stored-procedures,docker,grant,Mysql,Security,Stored Procedures,Docker,Grant,我想知道是否可以向用户授予执行权限,而不授予在其上运行过程的表的SELECT、INSERT等权限 将其用于webapp的登录表。MySQL正在Docker容器中运行。用于创建过程的SQL将作为docker构建过程的一部分进行复制。运行时,SQL将在entrypoint.sh中使用。登录数据库是在运行container-e标志时创建的 我想删除下面的“授权选择”行,这样,无论发生什么情况,webapp服务器都无法运行选择查询,例如从登录中执行SELECT* 这并不能解决问题,因为作为表所有者将公开

我想知道是否可以向用户授予执行权限,而不授予在其上运行过程的表的SELECT、INSERT等权限

将其用于webapp的登录表。MySQL正在Docker容器中运行。用于创建过程的SQL将作为docker构建过程的一部分进行复制。运行时,SQL将在entrypoint.sh中使用。登录数据库是在运行container-e标志时创建的

我想删除下面的“授权选择”行,这样,无论发生什么情况,webapp服务器都无法运行选择查询,例如从登录中执行SELECT*

这并不能解决问题,因为作为表所有者将公开相同的权限:

这也许可以解释为什么我不能,但表名对我MySQL新手来说有点奇怪-我的印象是MySQL.proc是一个系统表,所以不确定它是否适用:

是否可能是root用户在创建过程时没有选择权限,因此登录用户无法运行该过程?因为Docker MySQL运行entrypoint.sh,然后运行环境变量

这里的过程代码我知道,不是最优雅的-考虑到定义者是root,我可以在这里授予并撤销登录用户的权限吗

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安全性定义程序来完成此操作:

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

DEFINER子句指定在以下情况下使用的MySQL帐户: 在例程执行时检查以下例程的访问权限: 具有SQL安全定义器特性

如果为DEFINER子句提供了一个用户值,那么它应该是一个MySQL 指定为“用户名”@“主机名”、当前用户或 当前用户。默认定义器值是执行 创建过程或创建函数语句。这和 明确指定定义者=当前用户

总而言之:在这种情况下,definer子句中的用户必须对基础表具有选择/插入权限,而执行存储过程的用户必须对存储过程具有执行权限。

添加了一个新用户ADMIN@localhost具有选择、插入和更新权限。ADMIN随后成为所有过程的定义者,“登录”@“172.24.0.7”只被授予执行权限。现在跑得很好

显然你不能像我尝试的那样使用root。感谢@Shadow为我指明了正确的方向

此处为最终SQL:


谢谢你的回答。如果我错了,请纠正我,但是>因此,过程成功或失败取决于调用程序是否具有针对它的执行权限和针对mysql.user表的选择权限。是否建议登录用户需要在登录表上具有SELECT权限?对不起,我不完全理解您的摘要。不过,有一点是肯定的,非管理员用户不应该有权访问mysql数据库中的任何表,即名为mysql的数据库。甚至没有选择。所以在你链接到的页面下面,有两个例子。我这样引用的东西。。。。。。。。第二个示例后面是MySQL.user表。这似乎表明,具有execute权限的用户必须对存储过程将在其上运行的表具有select权限?否,示例后面的文档明确说明了过程的成功或失败,这取决于调用程序是否对其具有执行权限,“admin”@“localhost”是否对mysql.user表具有选择权限。管理员帐户是示例中的定义者。啊!这两个例子中的第一个是相关的。明白了!谢谢
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;