в MySQL странные результаты при удалении / добавлении пользователей - PullRequest
1 голос
/ 08 октября 2011

имеют подпрограмму безопасности, которая из массива имен пользователей, паролей и разрешений

  • удаляет пользователя
  • создает (того же самого) пользователя
  • предоставляетдоступ к таблицам, процедурам и т. д.
// $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. Некоторые изменения были сделаны для ограничений MySQL с помощью GRANT и REVOKE, а именно, GRANT был сделан для каждой таблицы (вместо SCHEMA), поэтому впоследствиивыданный REVOKE будет работать правильно.)

KLUDGE Solution

После настройки GRANT и REVOKE для пользователей, сделайте еще один проход через пользователей и SET PASSWORD.Ужасно, но это работает.

Все еще ищите лучшего понимания того, что происходит.

Правильное решение KLUDGE

Согласно ответу ниже (спасибо!) MySQL имеет неКоманда ANSI FLUSH ПРИВИЛЕГИИ.Выдается после DROP USER и до CREATE USER и MySQL больше не сбрасывает пароль пользователя.

1 Ответ

1 голос
/ 08 октября 2011

Попробуйте выполнить PRUSILEGES FLUSH после операторов CREATE USER. Согласно документации:

Сервер кэширует информацию в памяти в результате GRANT и СОЗДАТЬ заявления пользователя. Эта память не освобождается соответствующие операторы REVOKE и DROP USER, поэтому для сервера, который выполняет много экземпляров операторов, которые вызывают кеширование, там будет увеличение использования памяти. Эта кэшированная память может быть освобождена с ПРИВИЛЕГИЯМИ ПРОМЫВКИ.

Стоит выстрел. Я заметил, что обновления таблицы пользователей не вступают в силу без выполнения этой команды.

...