为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限

Posted

技术标签:

【中文标题】为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限【英文标题】:Grant [almost] all mySQL privileges for all but one/a few tables 【发布时间】:2012-04-18 02:18:57 【问题描述】:

问题:

我怎样才能为新用户提供几乎所有权限,但仍保护一个或多个表/数据库不受这些权限的影响。

详情:

如果我有一个数据库,

life

还有三张桌子

passwords friends hobbies

我如何给这个用户,例如,以下权限:

插入 更新 删除 创建 丢弃 改变

关于前三个,我会这样开始:

GRANT INSERT, UPDATE, DELETE ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT INSERT, UPDATE, DELETE ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

但我对如何使用CREATEDROP 感到困惑。如果我像这样授予整个数据库的删除权限:

GRANT DROP ON life TO username@'localhost' IDENTIFIED BY 'password';

然后用户可以删除我不想要的passwords 表。我可以改为根据如下表格授予它:

GRANT DROP ON life.friends TO username@'localhost' IDENTIFIED BY 'password';
GRANT DROP ON life.hobbies TO username@'localhost' IDENTIFIED BY 'password';

但是如果我像这样授予CREATE 权限会发生什么:

GRANT CREATE ON life TO username@'localhost' IDENTIFIED BY 'password';

这是否意味着用户甚至不能删除他/她创建的表?我的问题还与创建/删除数据库有关。如果我想允许用户创建和删除尽可能多的他们自己的数据库,但不是life数据库怎么办?

我是否应该通过将passwords 表移动到另一个数据库来改变我的方法?

先谢谢你了。

【问题讨论】:

独立的数据库是要走的路。 mysql 权限是有限的。他们不允许deny 特权。 @TheScrumMeister 如果您发布它,我会接受它作为答案 它不是一个完整的答案;-)。作为处理过 MySql 权限的人,这是我遇到的(许多)限制之一。 您对此有什么吸引力吗? @MikePurcell 有点。我为CREATE/DROP 权限使用单独的数据库,使用GRANT 授予用户对特定列的访问权限,并使用VIEWS 授予用户仅对特定行的访问权限。 【参考方案1】:

@TheScrumMeister 建议使用单独数据库的替代方法是定义一个包装 CREATE TABLE 的过程,同时授予调用用户 DROP 权限:

DELIMITER ;;

CREATE PROCEDURE create_table(
  tbl_name VARCHAR(64) -- maximum length of a table name
) BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
  START TRANSACTION;
    SET @usr = SUBSTRING_INDEX(USER(), '@', 1);  -- invoking username
    SET @tbl = REPLACE(tbl_name, "`", "``");     -- prevent SQL injection

    -- just create some dummy table initially - the user can modify it after
    SET @qry = CONCAT("
      CREATE TABLE `", @tbl, "` (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
      );
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    -- now grant DROP to the invoking user but only from localhost
    SET @qry = CONCAT("
      GRANT DROP ON life.`", @tbl, "`
      TO CONCAT(?, \"@'localhost'\") IDENTIFIED BY 'password';
    ");
    PREPARE stmt FROM  @qry;
    EXECUTE stmt USING @usr;
    DEALLOCATE PREPARE stmt;

    -- clean up
    SET @qry = NULL;
    SET @usr = NULL;
  COMMIT;
END;;

DELIMITER ;

为了确保用户不会以任何其他方式创建表,他们不应拥有CREATE TABLE 权限。

你也可以对数据库做类似的事情。

【讨论】:

我从没想过。谢谢

以上是关于为除一个/几个表之外的所有表授予 [几乎] 所有 mySQL 权限的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 重写 get_member() 函数,为除 bot 之外的所有用户返回 None

授予 MySQL 中各个字段的权限

XAMPP 为除 phpmyadmin 之外的所有内容提供 Forbidden 403

为除 main 之外的所有分支触发 GitHub Actions,其中唯一的工作流定义文件是

为除管理员之外的所有用户禁用Wordpress管理栏

将几个表/列放入 CSV 文件