6.2.6 Управление доступом, этап 2: Проверка запроса
После того, как сервер принимает подключение, он переходит к этапу 2 управления доступом. Для каждого запроса, который вы отправляете через подключение, сервер определяет операцию, которую вы хотите выполнить, а затем проверяет, достаточно ли у вас привилегий. Здесь вступают в игру столбцы привилегий в таблицах разрешений. Эти привилегии могут исходить из таблиц user, db, tables_priv, columns_priv или procs_priv. (Вам может быть полезно обратиться к разделу 6.2.3 «Таблицы разрешений», в котором перечислены столбцы, присутствующие в каждой таблице разрешений.)
Таблица user предоставляет глобальные привилегии. Строка таблицы user для учетной записи указывает привилегии учетной записи, которые применяются глобально, независимо от базы данных по умолчанию. Например, если таблица user предоставляет вам привилегию DELETE, вы можете удалять строки из любой таблицы в любой базе данных на хосте сервера. Целесообразно предоставлять привилегии в таблице user только тем людям, которым они необходимы, например, администраторам баз данных. Для других пользователей оставьте все привилегии в таблице user установленным в значение 'N' и предоставляйте привилегии на более конкретном уровне только (для конкретных баз данных, таблиц, столбцов или процедур).
Таблица 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, поскольку только она определяет административные привилегии. Сервер предоставляет доступ, если строка разрешает запрошенную операцию, и отказывается в противном случае. Например, если вы хотите выполнить 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.