【问题标题】:in mysql, weird results when dropping / adding users在 mysql 中,删除/添加用户时的结果很奇怪
【发布时间】:2011-12-03 11:38:55
【问题描述】:

有一个安全例程,该例程来自一组用户名、密码和权限

  • 删除用户
  • 创建(相同的)用户
  • 授予对表、过程等的访问权限
// $users - 用户记录数组 // $tables - 来自 `show tables` 的表列表 // 根据需要创建用户,重置密码 foreach( $users 作为 $user=>$arr ) { mysql_query("删除用户 {$arr['user']}" ); mysql_query("创建由'{$arr['pwd']}'标识的用户{$arr['user']}"); }; // 为每个用户设置权限 foreach( $users 作为 $user=>$arr ) { if(@$arr['table_grant']) foreach($tables as $table) mysql_query("将 $table 上的 {$arr['table_grant']} 授予 {$arr['user']}" ); if(@$arr['tables_revoke']) foreach($arr['tables_revoke'] as $table) mysql_query("从 {$arr['user']} 撤销 $table 上的 {$arr['table_grant']}" ); if(@$arr['procedures_grant']) foreach($arr['procedures_grant'] as $proc mysql_query("授权执行 $proc 到 {$arr['user']}" ); if(@$arr['functions_grant']) foreach($arr['functions_grant'] as $func) mysql_query("将函数 $func 的执行权限授予 {$arr['user']}" ); }

如果没有用户存在,它工作正常。

如果用户已经存在,那么用户就在那里,但是没有密码,除了最后一个创建的用户之外。

mysql> select user, password from mysql.user where user like 'm%'; +------------+------------------------------------ --------+ |用户 |密码 | +------------+------------------------------------ --------+ |按摩150 | *21A196706D99436A1C8163A98AE0687C432C37E2 | |登录 | *DE069F0ED7E311D173CB01C3DD136D282E66048D | |选择 | | | mdml | | +------------+------------------------------------ --------+ 4 行一组(0.00 秒)

当使用用户和权限时,是否有某种sync 进程需要在MySQL 中运行?我需要删除它们,等待几秒钟,然后重新创建吗?还是什么?

(代码在 postgreSQL 和 Oracle 中运行良好。针对 MySQL 对 GRANT 和 REVOKE 的限制进行了一些修改,即 GRANT 是在逐个表的基础上(而不是 SCHEMA 范围)进行的,因此随后发布的 REVOKE 可以正常工作。 )


KLUDGE 解决方案

为用户设置GRANTs和REVOKEs后,再通过用户和SET PASSWORD。丑陋,但它有效。

仍在寻找对正在发生的事情的更好理解。

正确的 KLUDGE 解决方案

根据下面的答案(谢谢!)MySQL 有一个非 ANSI 命令 FLUSH PRIVILEGES。在 DROP USER 和 CREATE USER 之前发出此问题,并且 MySQL 不再删除用户密码。

【问题讨论】:

    标签: mysql security permissions


    【解决方案1】:

    尝试在 CREATE USER 语句之后执行 FLUSH PRIVILEGES。根据文档:

    服务器在内存中缓存信息作为 GRANT 和 创建用户语句。该内存不是由 相应的 REVOKE 和 DROP USER 语句,所以对于一个服务器 执行导致缓存的语句的许多实例,有 会增加内存使用。这个缓存的内存可以被释放 具有刷新特权。

    值得一试。我注意到如果不运行此命令,对 users 表的更新不会直接生效。

    【讨论】:

    • 把它放在 DROP USER 之后和 CREATE USER 之前 - 工作正常! - 谢谢 - 完全不是你的问题,仍然保留抱怨必须使用非标准 SQL 才能使事情在 MySQL 中简单工作的权利。
    猜你喜欢
    • 2016-05-03
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2016-10-31
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多