有一个安全例程,来自一组用户名,密码和权限
// $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将正常工作。 )
为用户设置GRANT和REVOKE后,再向用户和SET PASSWORD
传递一次。丑陋,但它确实有效。
仍在寻找更好地了解正在发生的事情。
根据下面的答案(谢谢!)MySQL有一个非ANSI命令FLUSH PRIVILEGES。在DROP USER之后,在CREATE USER和MySQL之前不再删除用户密码。
答案 0 :(得分:1)
尝试在CREATE USER语句后执行FLUSH PRIVILEGES。根据文档:
服务器通过GRANT和缓存内存中的信息 CREATE USER语句。这个记忆不是由释放的 相应的REVOKE和DROP USER语句,所以对于服务器来说 执行导致缓存的语句的许多实例 将增加内存使用量。可以释放此缓存的内存 使用FLUSH PRIVILEGES。
值得一试。我注意到,如果不运行此命令,用户表的更新不会直接生效。