Sunday, August 30, 2009

Об аутентификации в mysql

MySQL снова удивил.
Допустим, нам надо добавить пользователя и разрешить ему доступ с любого хоста. По памяти набираю:

CREATE USER 'user'@'%' IDENTIFIED BY 'pass';
GRANT ALL PRIVILEGES ON mybd.* TO 'user'@'% WITH GRANT OPTION;

Вроде бы все ок. Тестируем с локального хоста, получаем 'Access denied'.

С паролями все ОК - хэш в таблице `user` совпадает с PASSWORD('pass'). В чем же дело ?

Таблица `user` сортируется перед использованием. Причем сперва по полю 'Host', потом 'User'.
Просмотр таблицы идет до первой подходящей записи. Поэтому в примере выше будет использоваться
запись ''@localhost а не 'user'@'%'. Для того чтобы можно было зайти с любого хоста, придется добавить
еще одну запись:

GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost' WITH GRANT OPTION;

Интересно, используется ли подобный алгоритм в других СУБД. Если кто в курсе - черкните в комменты.

5 comments:

  1. В PostgreSQL креденшлы не в БД лежат, если я правильно ошибаюсь.

    ReplyDelete
  2. Угу, в отдельном файлике. И по дефолту доступ отовсюду, окромя локалхоста, запилен.

    ReplyDelete
  3. create user не нужен, достаточно просто
    grant all privileges on db_name.* to 'user'@host' identified by 'pass';
    и нехер лазать к базе откуда-то, кроме локалхоста :)

    ReplyDelete
  4. >и нехер лазать к базе откуда-то, кроме локалхоста :)
    Это почему ? :-)
    А если хочется залить данные на удаленную БД (логи, статистика, etc.), писать для этого отдельный скрипт и ложить его на сервер смысла не вижу..

    ReplyDelete
  5. Это документировано с древних времен в оригинальной документации.

    ReplyDelete