在mysql中,删除/添加用户时会产生奇怪的结果

时间:2011-10-08 08:29:41

标签: mysql security permissions

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

  • 删除用户
  • 创建(相同)用户
  • 授予对表格,程序等的访问权
// $users - Array of user records
// $tables - list of tables from `show tables`

// create users as necessary, reset password
foreach( $users as $user=>$arr ) {
        mysql_query( "drop user {$arr['user']}" );
        mysql_query( "create user {$arr['user']} identified by '{$arr['pwd']}'" );
};

// for each user set permission
foreach( $users as $user=>$arr ) {
     if( @$arr['table_grant'] ) foreach( $tables as $table )
        mysql_query( "grant {$arr['table_grant']} on $table to {$arr['user']}" );
     if( @$arr['tables_revoke'] ) foreach( $arr['tables_revoke'] as $table )                
        mysql_query( "revoke {$arr['table_grant']} on $table from {$arr['user']}" );
     if( @$arr['procedures_grant'] ) foreach( $arr['procedures_grant'] as $proc 
        mysql_query( "grant execute on procedure $proc to {$arr['user']}" );
     if( @$arr['functions_grant'] ) foreach( $arr['functions_grant'] as $func )
        mysql_query( "grant execute on function $func to {$arr['user']}" );
}

如果没有用户,则可以正常使用。

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

mysql> select user, password from mysql.user where user like 'm%';
+------------+-------------------------------------------+
| user       | password                                  |
+------------+-------------------------------------------+
| massage150 | *21A196706D99436A1C8163A98AE0687C432C37E2 |
| mlogin     | *DE069F0ED7E311D173CB01C3DD136D282E66048D |
| mselect    |                                           |
| mdml       |                                           |
+------------+-------------------------------------------+
4 rows in set (0.00 sec)

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

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


KLUDGE解决方案

为用户设置GRANT和REVOKE后,再向用户和SET PASSWORD传递一次。丑陋,但它确实有效。

仍在寻找更好地了解正在发生的事情。

纠正KLUDGE解决方案

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

1 个答案:

答案 0 :(得分:1)

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

  

服务器通过GRANT和缓存内存中的信息   CREATE USER语句。这个记忆不是由释放的   相应的REVOKE和DROP USER语句,所以对于服务器来说   执行导致缓存的语句的许多实例   将增加内存使用量。可以释放此缓存的内存   使用FLUSH PRIVILEGES。

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