Spec-Zone.ru › MySQL 9.2

8.2.7 Управление доступом, этап 2: Проверка запроса

После того, как сервер принимает подключение, он переходит ко второму этапу управления доступом. Для каждого запроса, который вы отправляете через подключение, сервер определяет выполняемую операцию и проверяет, достаточно ли у вас привилегий. Именно здесь вступают в игру столбцы привилегий в таблицах грантов. Эти привилегии могут исходить из таблиц user, global_grants, db, tables_priv, columns_priv или procs_priv. (Возможно, вам будет полезно обратиться к разделу 8.2.3 «Таблицы грантов», в котором перечислены столбцы, присутствующие в каждой таблице грантов.)

Таблицы user и global_grants предоставляют глобальные привилегии. Строки в этих таблицах для данного аккаунта указывают привилегии аккаунта, которые применяются на глобальном уровне независимо от текущей базы данных. Например, если таблица user предоставляет вам привилегию DELETE, вы можете удалять строки из любой таблицы в любой базе данных на хосте сервера. Желательно предоставлять привилегии в таблице user только тем, кому они необходимы, например, администраторам баз данных. Для других пользователей оставьте все привилегии в таблице user установленным значением 'N' и предоставляйте привилегии на более конкретном уровне (для конкретных баз данных, таблиц, столбцов или процедур). Также возможно предоставлять глобальные привилегии на уровне базы данных, но использовать частичные отзыв для ограничения их использования на конкретных базах данных (см. раздел 8.2.12 «Ограничение привилегий с помощью частичных отзывов»).

Таблица db предоставляет привилегии, специфичные для базы данных. Значения в столбцах области этой таблицы могут принимать следующие формы:

  • Пустое значение User соответствует анонимному пользователю. Непустое значение соответствует точному имени; в именах пользователей нет подстановочных символов.

  • Подстановочные символы % и _ могут использоваться в столбцах Host и Db. Они имеют то же значение, что и для операций сопоставления шаблонов с оператором LIKE. Если вы хотите использовать любой из этих символов буквально при предоставлении привилегий, вы должны экранировать его обратной косой чертой. Например, чтобы включить символ нижнего подчеркивания (_) в качестве части имени базы данных, укажите его как \_ в инструкции GRANT.

  • Значение '%' или пустое значение Host означает «любой хост».

  • Значение '%' или пустое значение Db означает «любая база данных».

Сервер считывает таблицу db в память и сортирует ее одновременно с чтением таблицы user. Сервер сортирует таблицу db по столбцам области Host, Db и User. Как и с таблицей user, сортировка помещает наиболее специфические значения в начало, а наименее специфические — в конец, и когда сервер ищет совпадения, он использует первое найденное совпадение.

Таблицы tables_priv, columns_priv и procs_priv предоставляют привилегии, специфичные для таблиц, столбцов и процедур. Значения в столбцах области этих таблиц могут принимать следующие формы:

  • Подстановочные символы % и _ могут использоваться в столбце Host. Они имеют то же значение, что и для операций сопоставления шаблонов с оператором LIKE.

  • Значение '%' или пустое значение Host означает «любой хост».

  • Столбцы Db, Table_name, Column_name и Routine_name не могут содержать подстановочные символы или быть пустыми.

Сервер сортирует таблицы tables_priv, columns_priv и procs_priv по столбцам Host, Db и User. Это аналогично сортировке таблицы db, но проще, поскольку только столбец Host может содержать подстановочные символы.

Сервер использует отсортированные таблицы для проверки каждого полученного запроса. Для запросов, требующих административных привилегий, таких как SHUTDOWN или RELOAD, сервер проверяет только таблицы user и global_privilege, поскольку только они определяют административные привилегии. Сервер предоставляет доступ, если строка для учетной записи в этих таблицах разрешает запрошенную операцию, и отказывается в противном случае. Например, если вы хотите выполнить mysqladmin shutdown, но строка вашей таблицы user не предоставляет вам привилегию SHUTDOWN, сервер отказывается в доступе, даже не проверяя таблицу db. (Последняя таблица не содержит столбец Shutdown_priv, поэтому нет необходимости проверять ее.)

Для запросов, связанных с базой данных (INSERT, UPDATE и т. д.), сервер сначала проверяет глобальные привилегии пользователя в строке таблицы user (за вычетом любых ограничений привилегий, наложенных частичными отзывами). Если строка разрешает запрошенную операцию, доступ предоставляется. Если глобальных привилегий в таблице user недостаточно, сервер определяет привилегии пользователя, специфичные для базы данных, из таблицы db:

  • Сервер ищет совпадение в таблице db по столбцам Host, Db и User.

  • Столбцы Host и User сопоставляются с именем хоста и именем пользователя MySQL подключенного пользователя.

  • Столбец Db сопоставляется с базой данных, к которой пользователь хочет получить доступ.

  • Если нет строки для Host и User, доступ отказывается.

После определения привилегий, специфичных для базы данных, предоставленных строками таблицы db, сервер добавляет их к глобальным привилегиям, предоставленным таблицей user. Если результат разрешает запрошенную операцию, доступ предоставляется. В противном случае сервер последовательно проверяет привилегии пользователя на таблицы и столбцы в таблицах tables_priv и columns_priv, добавляет их к привилегиям пользователя и разрешает или отказывается в доступе в зависимости от результата. Для операций с хранимыми процедурами сервер использует таблицу procs_priv вместо tables_priv и columns_priv.

В булевых терминах предшествующее описание вычисления привилегий пользователя можно обобщить следующим образом:

global privileges
OR database privileges
OR table privileges
OR column privileges
OR routine privileges

Возможно, неясно, почему, если первоначально глобальные привилегии недостаточно для запрошенной операции, сервер добавляет эти привилегии к привилегиям базы данных, таблицы и столбца позже. Причина в том, что запрос может потребовать более одного типа привилегий. Например, если вы выполняете инструкцию INSERT INTO ... SELECT, вам нужны как привилегии INSERT, так и привилегии SELECT. Ваши привилегии могут быть такими, что строка таблицы user предоставляет одну привилегию глобально, а строка таблицы db предоставляет другую конкретно для соответствующей базы данных. В этом случае у вас есть необходимые привилегии для выполнения запроса, но сервер не может определить это только по глобальным или базам данных привилегий. Он должен принять решение о доступе на основе совокупных привилегий.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/request-access.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API