【问题标题】:Temporarily disable write (INSERT, UPDATE, etc.) of MySQL connection session with PHP PDO?使用 PHP PDO 暂时禁用 MySQL 连接会话的写入(INSERT、UPDATE 等)?
【发布时间】:2018-01-10 05:16:42
【问题描述】:

对于特定的连接会话,普通 MySQL 用户(SELECT、INSERT、UPDATE)是否可以使用暂时较少权限(仅 SELECT)连接到服务器?

我问这是因为我们的服务器上有很多 MySQL 用户管理着数千个数据库。每个用户将负责例如50 个数据库。现在他们需要创建 API 并发布对数据库的公共访问权限,最好使用只有 SELECT 权限的 MySQL 用户来访问数据库。我们可以为此目的创建一个全局用户,但随后它将有权访问所有数据库。

所以最好只使用 SELECT 权限限制对某些数据库的访问。

有什么方法可以使用现有的 MySQL 用户,然后只在连接的基础上修改其权限(撤销 INSERT、UPDATE)?

更新

我知道如何撤销一般 MySQL 用户的权限,但我只需要撤销特定连接会话中的权限,这样撤销就不会影响同一用户的其他 MySQL 连接。

有什么想法吗?还是根本不可能?

【问题讨论】:

  • 可以this 帮忙吗?
  • @Geshode 这也会影响需要写入权限的同一用户的其他会话?
  • 它似乎是永久的,但我想,如果你找不到另一个解决方案,那么你可以使用它编写一个程序来为每个会话更改它。但我同意,一个更简单的解决方案会更好。
  • 你用revoke试过了吗?
  • @Geshode,我知道一般如何授予和撤销权限,但我只需要在每个连接中临时授予/撤销它们。

标签: php mysql database pdo


【解决方案1】:

https://dev.mysql.com/doc/refman/5.7/en/privilege-changes.html 说:

授权表重新加载会影响每个现有客户端的权限 连接如下:

  • 表和列权限更改在客户端的下一个请求时生效。

  • 数据库权限更改在客户端下次执行 USE db_name 语句时生效。

  • 全局权限和密码对于已连接的客户端不受影响。这些更改仅对后续连接生效。

换句话说,每个请求都会检查权限 - 即在每个查询之前。每台服务器的内存中只有一个权限副本,所有会话都检查同一组加载的权限。该用户无法在不同的会话中强制执行不同的权限。

在我之前处理的一个应用程序中,我们解决了与您描述的问题类似的问题。我们为每个应用程序创建了两个 MySQL 用户:一个对一个数据库具有完全权限,另一个对那个数据库具有只读权限。

应用程序将使用一组凭据或另一组凭据登录,该选择将决定它拥有哪些权限。

【讨论】:

    【解决方案2】:

    先REVOKE所有权限,再GRANT你想要的权限

    【讨论】:

      【解决方案3】:

      您应该对此类问题使用授予权限。

      GRANT privilege,[privilege],.. ON privilege_level 
      TO user [IDENTIFIED BY password]
      [REQUIRE tsl_option]`enter code here`
      [WITH [GRANT_OPTION | resource_option]];
      

      您可以在单个 GRANT 语句中授予多个权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 2010-11-26
        • 2014-10-28
        • 2015-05-30
        • 2016-10-20
        相关资源
        最近更新 更多