簡體   English   中英

僅向用戶提供GRANT EXECUTE“過程”(無選擇或插入權限)

[英]Provide only GRANT EXECUTE 'procedure' to a user (No select or insert permissions)

我想知道是否可以向用戶授予EXECUTE權限而無需授予對過程運行的表的SELECTINSERT等權限?

將其用於Web應用程序的登錄表。 MySQL在Docker容器中運行。 創建過程的SQL在docker構建過程中被復制(運行時,在entrypoint.sh中使用該sql)。 運行容器時將創建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;

這不能解決問題-因為作為表所有者會暴露相同的特權:

由於表權限的原因,執行存儲的過程失敗並顯示GRANT EXECUTE

這可能可以解釋為什么我不能這樣做,但是表名對我來說有點奇怪(MySQL新手-我給人的印象是mysql.proc是系統表,因此不確定是否適用):

如何授予用戶執行特定存儲過程的權限

可能是root用戶在創建過程時沒有SELECT特權,因此登錄用戶無法運行它嗎? (因為Docker MySQL先運行entrypoint.sh,然后運行環境變量)?

過程代碼在這里(我知道,不是最優雅的)-考慮到DEFINER是root用戶,我可以在其中授予logins用戶的GRANT權限然后REVOKE權限嗎?

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子句中的用戶必須具有對基礎表的選擇/插入特權,而執行存儲的proc的用戶必須具有對存儲的proc的執行特權。

添加了具有SELECTINSERTUPDATE特權的新用戶ADMIN@localhost ADMIN然后成為了DEFINER所有程序,用'logins'@'172.24.0.7'僅被授予EXECUTE權限。 現在運行完美!

顯然,您不能以我嘗試的方式使用root。 感謝@Shadow向我指出正確的方向。

此處的最終SQL:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM