仅向用户提供 GRANT EXECUTE 'procedure'(无 select 或插入权限)
Provide only GRANT EXECUTE 'procedure' to a user (No select or insert permissions)
我想知道是否可以向用户授予 EXECUTE
权限 而无需 授予 SELECT
、INSERT
等权限table 程序 运行 正在运行?
将其用于 Web 应用程序的登录 table。 MySQL 在 Docker 容器中 运行ning。用于创建过程的 SQL 作为 docker 构建过程的一部分被复制(当 运行 时,sql 用于 entrypoint.sh)。 Login_db 在 运行 容器(-e 标志)时创建。
我想从下面删除 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;
这并不能解决问题 - 作为 table 所有者会暴露相同的权限:
Execute stored proc fails with GRANT EXECUTE because of table permissions
这可能解释了为什么我不能,但是 table 名字对我来说有点奇怪(MySQL 新手 - 我的印象是 mysql.proc
是一个系统 table,所以不确定它是否适用):
How to grant execute on specific stored procedure to user
会不会是 root 在创建过程时没有 SELECT 权限,所以登录用户不能 运行 呢? (因为DockerMySQL运行sentrypoint.sh然后是环境变量)?
程序代码在这里(我知道,不是最优雅的)- 我可以 GRANT
然后 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;
是的,您可以在声明 stored procedure:
时使用 sql security definer
The SQL SECURITY characteristic can be DEFINER or INVOKER to specify
the security context; that is, whether the routine executes using the
privileges of the account named in the routine DEFINER clause or the
user who invokes it. This account must have permission to access the
database with which the routine is associated. The default value is
DEFINER. The user who invokes the routine must have the EXECUTE
privilege for it, as must the DEFINER account if the routine executes
in definer security context.
The DEFINER clause specifies the MySQL account to be used when
checking access privileges at routine execution time for routines that
have the SQL SECURITY DEFINER characteristic.
If a user value is given for the DEFINER clause, it should be a MySQL
account specified as 'user_name'@'host_name', CURRENT_USER, or
CURRENT_USER(). The default DEFINER value is the user who executes the
CREATE PROCEDURE or CREATE FUNCTION statement. This is the same as
specifying DEFINER = CURRENT_USER explicitly.
总结一下:definer子句中的用户必须有select / insert privileges to the underlying table in this ase,而执行存储过程的用户必须有对存储过程的执行权限。
添加了具有 SELECT
、INSERT
和 UPDATE
权限的新用户 ADMIN@localhost
。 ADMIN
然后成为所有程序的 DEFINER
,'logins'@'172.24.0.7'
仅被授予 EXECUTE
权限。现在运行完美!
显然您不能像我尝试的那样使用 root。感谢@Shadow 为我指明了正确的方向。
设置管理员用户:
CREATE USER 'admin'@'localhost' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE, DELETE ON db.table_name TO 'admin'@'localhost';
GRANT ALTER ROUTINE, CREATE ROUTINE, EXECUTE ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
定义使用受限管理员用户创建条目的存储过程
DELIMITER $$
CREATE DEFINER=`admin`@`localhost` PROCEDURE `sp_createTableEntry`(
IN value_one VARCHAR(120),
IN value_two VARCHAR(200)
)
BEGIN
IF ( select exists (select 1 from table_name where column_one = value_one) ) THEN
select 'Column One Exists !!';
ELSE
insert into table_name
(
column_one,
column_two
)
values
(
value_one,
value_two
);
END IF ;
END $$
DELIMITER ;
我想知道是否可以向用户授予 EXECUTE
权限 而无需 授予 SELECT
、INSERT
等权限table 程序 运行 正在运行?
将其用于 Web 应用程序的登录 table。 MySQL 在 Docker 容器中 运行ning。用于创建过程的 SQL 作为 docker 构建过程的一部分被复制(当 运行 时,sql 用于 entrypoint.sh)。 Login_db 在 运行 容器(-e 标志)时创建。
我想从下面删除 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;
这并不能解决问题 - 作为 table 所有者会暴露相同的权限:
Execute stored proc fails with GRANT EXECUTE because of table permissions
这可能解释了为什么我不能,但是 table 名字对我来说有点奇怪(MySQL 新手 - 我的印象是 mysql.proc
是一个系统 table,所以不确定它是否适用):
How to grant execute on specific stored procedure to user
会不会是 root 在创建过程时没有 SELECT 权限,所以登录用户不能 运行 呢? (因为DockerMySQL运行sentrypoint.sh然后是环境变量)?
程序代码在这里(我知道,不是最优雅的)- 我可以 GRANT
然后 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;
是的,您可以在声明 stored procedure:
时使用sql security definer
The SQL SECURITY characteristic can be DEFINER or INVOKER to specify the security context; that is, whether the routine executes using the privileges of the account named in the routine DEFINER clause or the user who invokes it. This account must have permission to access the database with which the routine is associated. The default value is DEFINER. The user who invokes the routine must have the EXECUTE privilege for it, as must the DEFINER account if the routine executes in definer security context.
The DEFINER clause specifies the MySQL account to be used when checking access privileges at routine execution time for routines that have the SQL SECURITY DEFINER characteristic.
If a user value is given for the DEFINER clause, it should be a MySQL account specified as 'user_name'@'host_name', CURRENT_USER, or CURRENT_USER(). The default DEFINER value is the user who executes the CREATE PROCEDURE or CREATE FUNCTION statement. This is the same as specifying DEFINER = CURRENT_USER explicitly.
总结一下:definer子句中的用户必须有select / insert privileges to the underlying table in this ase,而执行存储过程的用户必须有对存储过程的执行权限。
添加了具有 SELECT
、INSERT
和 UPDATE
权限的新用户 ADMIN@localhost
。 ADMIN
然后成为所有程序的 DEFINER
,'logins'@'172.24.0.7'
仅被授予 EXECUTE
权限。现在运行完美!
显然您不能像我尝试的那样使用 root。感谢@Shadow 为我指明了正确的方向。
设置管理员用户:
CREATE USER 'admin'@'localhost' IDENTIFIED BY '<password>';
GRANT SELECT, INSERT, UPDATE, DELETE ON db.table_name TO 'admin'@'localhost';
GRANT ALTER ROUTINE, CREATE ROUTINE, EXECUTE ON *.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
定义使用受限管理员用户创建条目的存储过程
DELIMITER $$
CREATE DEFINER=`admin`@`localhost` PROCEDURE `sp_createTableEntry`(
IN value_one VARCHAR(120),
IN value_two VARCHAR(200)
)
BEGIN
IF ( select exists (select 1 from table_name where column_one = value_one) ) THEN
select 'Column One Exists !!';
ELSE
insert into table_name
(
column_one,
column_two
)
values
(
value_one,
value_two
);
END IF ;
END $$
DELIMITER ;