【问题标题】:mariadb-mysql permissions issuemariadb-mysql 权限问题
【发布时间】:2017-01-02 10:18:17
【问题描述】:

我有一个问题,当我尝试通过我的 Web 应用程序执行存储过程时,我看到以下错误

SQLSTATE[42000]: Syntax error or access violation: 1142 INSERT command denied to user 'elitecareers_admin'@'%' for table 'user'

为了清楚起见,这是我的存储过程

DELIMITER $$
CREATE PROCEDURE `sp_create_account`( username_param VARCHAR(40), email_param VARCHAR(60), pass_w VARCHAR(30), category_id TINYINT )
BEGIN 
    DECLARE salt VARCHAR(60);
    DECLARE password_var VARCHAR(128);

    SET salt = 'ELiCrs@4$^7EC%?';
    SET salt = CONCAT( username_param, salt );
    SET password_var = SHA2( CONCAT( pass_w, salt ), 0 );

    INSERT INTO elite.user
    ( user_id, username, email, pass, active, date_joined, user_category_id )
    VALUES
    ( DEFAULT, username_param, email_param, password_var, DEFAULT, DEFAULT, category_id );
END $$
DELIMITER ;

这是我运行 show 命令时存储过程的外观

这也是我的服务器信息

以下是用户 'elitecareers_admin'@'%' 的权限,在该权限下执行 Web 应用程序

我不明白如果用户对数据库拥有所有权限,那么为什么 mysql/maria 服务器会保留这些错误?

【问题讨论】:

  • 也许你只需要FLUSH PRIVILEGES;
  • @Hackerman 不要把mysql的用户表和普通的用户表混在一起!
  • @Shadow 我不明白...你能详细说明一下吗?
  • 在存储过程中您插入到elite.user,而授权适用于elitecareers\_elite 数据库。 2 个数据库名称不匹配。
  • 执行SHOW CREATE PROCEDURE sp_create_account \G 查找创建过程的人以及“安全”是“调用者”还是“所有者”。

标签: mysql permissions mariadb


【解决方案1】:

"SQL SECURITY特性可以是DEFINER或者INVOKER来指定安全上下文;即例程是使用例程DEFINER子句中指定的账户的权限还是调用它的用户的权限执行。这个账户必须有权限访问与例程关联的数据库。默认值为 DEFINER。 调用例程的用户必须具有它的 EXECUTE 权限,如果例程在定义者安全中执行,则必须具有 DEFINER 帐户上下文。" -- https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

因此,无论谁运行 proc,'elitecareers_admin'@'%' 的权限都将用于诸如访问表 elite.user 之类的事情。但该用户似乎只拥有数据库elitecareers\_elite 的权限。

计划 A:使用适当的 SQL SECURITY INVOKERif 重新创建 proc。

B 计划:找出数据库eliteelitecareers\_elite 之间的区别。

计划 C:添加另一个 GRANT 以让该管理员访问 elite

Plan D:(可能还有其他解决方案。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多