[英]Provide only GRANT EXECUTE 'procedure' to a user (No select or insert permissions)
我想知道是否可以向用戶授予EXECUTE
權限而無需授予對過程運行的表的SELECT
, INSERT
等權限?
將其用於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的執行特權。
添加了具有SELECT
, INSERT
和UPDATE
特權的新用戶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.