Spec-Zone .ru
спецификации, руководства, описания, API
|
Приложения могут использовать следующие направляющие линии, чтобы выполнить основанный на SQL контроль, который связывает действие базы данных с учетными записями MySQL.
Учетные записи MySQL соответствуют строкам в mysql.user
таблица. Когда клиент
соединяется успешно, сервер аутентифицирует клиент к определенной строке в этой таблице. User
и Host
значения столбцов в этой строке однозначно определяют учетную запись и
соответствуют '
формат, в котором имена учетной записи пишутся в
SQL-операторах. user_name
'@'host_name
'
Учетная запись, используемая, чтобы аутентифицировать клиент, определяет, который дает клиенту полномочия,
имеет. Обычно, CURRENT_USER()
функция может быть вызвана, чтобы определить, какая учетная
запись это для клиентского пользователя. Его значение создается из User
и Host
столбцы user
строка таблицы для учетной записи.
Однако, есть обстоятельства под который CURRENT_USER()
значение соответствует не клиентскому пользователю, но различной
учетной записи. Это происходит в контекстах, когда проверка полномочия не базируется учетная запись клиента:
Сохраненные подпрограммы (процедуры и функции) определенный с помощью SQL SECURITY DEFINER
характеристика
Представления, определенные с помощью SQL SECURITY
DEFINER
характеристика
Триггеры и события
В тех контекстах проверка полномочия делается против DEFINER
учетная запись и CURRENT_USER()
ссылается на ту учетную запись, не на учетную запись за клиент, который вызвал сохраненную подпрограмму или
представление или кто заставил триггер активироваться. Чтобы определить пользователя вызова, можно вызвать USER()
функция,
которая возвращает значение, указывающее на фактическое имя пользователя, обеспеченное клиентом и узлом от
который соединенный клиент. Однако, это значение не обязательно соответствует непосредственно учетной записи в
user
таблица, потому что USER()
значение никогда не содержит подстановочные знаки, тогда как учетная
запись оценивает (как возвращено CURRENT_USER()
) может содержать подстановочные знаки имени пользователя и
имени хоста.
Например, пустое имя пользователя соответствует любому пользователю, таким образом, учетная запись ''@'localhost'
позволяет клиентам соединиться как анонимный пользователь от
локального узла с любым именем пользователя. Если этот случай, если клиент соединяется как user1
от локального узла, USER()
и CURRENT_USER()
возвратите различные значения:
mysql> SELECT USER(), CURRENT_USER();
+-----------------+----------------+| USER() | CURRENT_USER() |+-----------------+----------------+| user1@localhost | @localhost |+-----------------+----------------+
Часть имени хоста учетной записи может содержать подстановочные знаки, также. Если имя хоста содержит a '%'
или '_'
символ образца или нотация сетевой маски
использования, учетная запись может использоваться для клиентов, соединяющихся от многократных узлов и CURRENT_USER()
значение не будет указывать который. Например, учетная запись 'user2'@'%.example.com'
может использоваться user2
соединяться от любого узла в example.com
домен. Если user2
соединяется от remote.example.com
, USER()
и CURRENT_USER()
возвратите различные значения:
mysql> SELECT USER(), CURRENT_USER();
+--------------------------+---------------------+| USER() | CURRENT_USER() |+--------------------------+---------------------+| user2@remote.example.com | user2@%.example.com |+--------------------------+---------------------+
Если приложение должно вызвать USER()
для пользователя, контролирующего (например, если это делает контроль
изнутри триггеров), но, должен также быть в состоянии связаться USER()
значение с учетной записью в user
таблица, необходимо избежать учетных записей, которые содержат подстановочные знаки в User
или Host
столбец. Определенно, не разрешать
User
чтобы быть пустыми (который создает анонимную учетную запись пользователя), и
не разрешают символы образца или нотацию сетевой маски в Host
значения. У всех
учетных записей должно быть непустое User
значение и литерал Host
значение.
Относительно предыдущих примеров, ''@'localhost'
и 'user2'@'%.example.com'
учетные записи должны быть изменены, чтобы не использовать подстановочные знаки:
RENAME USER ''@'localhost' TO 'user1'@'localhost';RENAME USER 'user2'@'%.example.com' TO 'user2'@'remote.example.com';
Если user2
должен быть в состоянии соединиться от нескольких узлов в example.com
домен, должно быть отдельное, учитывают каждый узел.
Чтобы извлечь имя пользователя или имя хоста расстаются с a CURRENT_USER()
или USER()
значение, используйте SUBSTRING()
функция:
mysql>SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',1);
+---------------------------------------+| SUBSTRING_INDEX(CURRENT_USER(),'@',1) |+---------------------------------------+| user1 |+---------------------------------------+mysql>SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',-1);
+----------------------------------------+| SUBSTRING_INDEX(CURRENT_USER(),'@',-1) |+----------------------------------------+| localhost |+----------------------------------------+