SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.01.2016 19:50:06

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Запрос и привилегии

Всем доброго времени суток.

Вопрос такой. Создаю юзера


CREATE USER 'test_user' IDENTIFIED BY 'test_user';
 


Нужно проверить, есть ли у него следующие привилегии:


GRANT SELECT ON *.* TO 'test_user';

GRANT SELECT ON mysql.proc TO 'test_user';
 


Нужен запрос, который вернет результат в виде:


     priv             |  has      |
-----------------------------------
  SELECT ON *.*       |   1       |
 



Ну короче 2-а столбца:
1) название привилегии
2) 1, если привилегия у пользователя есть, и 0, если ее нет?

Причем запрос этот должен отработать под этим юзером. Поэтому я так понимаю если у пользователя нет привилегии

GRANT SELECT ON *.* TO 'test_user';
 


то стучаться в mysql.user бессмысленно, запрос упадет. Как написать подобный запрос, подскажите плиз.

Неактивен

 

#2 22.01.2016 21:29:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос и привилегии

SHOW GRANTS;

Неактивен

 

#3 23.01.2016 12:37:08

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

vasya написал:

SHOW GRANTS;

Select по нему как-то можно сделать?

Мне нужен результат именно в том виде, как я описал выше.

Отредактированно bobanman (23.01.2016 12:39:01)

Неактивен

 

#4 23.01.2016 12:48:52

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

SELECT Select_priv FROM mysql.user where user='test_user';

Неактивен

 

#5 23.01.2016 12:58:01

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

rgbeast написал:

SELECT Select_priv FROM mysql.user where user='test_user';

Да,но если у меня нет привилегии

SELECT ON *.*


то этот запрос упадет с эксепшном насколько я понимаю, а мне нужно получить нолик или единичку.

Или можно добиться того, чтобы этот запрос не упал даже без привилегии SELECT ON *.*?

Отредактированно bobanman (23.01.2016 13:10:30)

Неактивен

 

#6 23.01.2016 13:57:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Запрос выдаст или Y или N, если пользователь существует. Кроме того, не забудьте, что пользователь идентифицируется не только именем, но и именем хоста.

Неактивен

 

#7 23.01.2016 17:17:42

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

rgbeast написал:

Запрос выдаст или Y или N, если пользователь существует. Кроме того, не забудьте, что пользователь идентифицируется не только именем, но и именем хоста.

Создал юзера:

CREATE USER 'test_user' IDENTIFIED BY 'test_user';

 


Захожу под этим юзером, и выполняю запрос:


SELECT Select_priv FROM mysql.user where user='test_user';
 


Вываливается:


Error Code: 1142. SELECT command denied to user 'test_user'@'localhost' for table 'user'
 


А мне нужно получить Y или N. Как это сделать при подключении именно этим юзером?

Отредактированно bobanman (23.01.2016 17:18:23)

Неактивен

 

#8 23.01.2016 18:24:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Обращение к этой таблице должно работать:

SELECT * FROM information_schema.user_privileges WHERE PRIVILEGE_TYPE='SELECT';

Неактивен

 

#9 23.01.2016 20:07:18

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

rgbeast написал:

Обращение к этой таблице должно работать:

SELECT * FROM information_schema.user_privileges WHERE PRIVILEGE_TYPE='SELECT';

Да, так работает, спасибо за помощь.

Неактивен

 

#10 23.01.2016 20:11:05

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

А подскажите плиз еще. Вот есть две привилегии:

GRANT SELECT ON *.* TO 'test_user';

GRANT SELECT ON mysql.proc TO 'test_user';


Первая покрывает вторую? Ну в смысле если дана первая, то вторая ничего дополнительного не дает? Или я не прав?

Неактивен

 

#11 23.01.2016 20:25:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Верно, вторая не дает ничего дополнительного к первой

Неактивен

 

#12 23.01.2016 21:17:27

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

А почему такой эффект?

Даю привилегию:

GRANT SELECT ON *.* TO 'test_user';


Захожу этим юзером.

Выполняю:
show grants


Получаю:

'GRANT SELECT ON *.* TO \'test_user\'@\'%\' IDENTIFIED BY PASSWORD <secret>'
 


Как бы все хорошо. Теперь делаю запрос:

SELECT * FROM information_schema.user_privileges WHERE PRIVILEGE_TYPE='SELECT';


И результат:

'\'test_user\'@\'%\'', 'def', 'SELECT', 'NO'
 


Почему NO?

Отредактированно bobanman (23.01.2016 21:18:18)

Неактивен

 

#13 23.01.2016 22:00:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Строчка означает, что привилегия есть. 'NO' относится к IS_GRANTABLE, то есть к праву передоверия (GRANT ... WITH GRANT OPTION)

Неактивен

 

#14 24.01.2016 00:43:57

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

rgbeast написал:

Строчка означает, что привилегия есть. 'NO' относится к IS_GRANTABLE, то есть к праву передоверия (GRANT ... WITH GRANT OPTION)

Т. е. зайдя под искомым юзером и выполнив запрос:

SELECT * FROM information_schema.user_privileges WHERE PRIVILEGE_TYPE='SELECT'


если есть строка, то у него есть привилегия

GRANT SELECT ON *.* TO 'test_user';


Или есть еще какие-то хитрости?

Неактивен

 

#15 24.01.2016 01:35:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Если это непривилегированный юзер, то так. Если зайдете по юзером, который имеет право видеть других, то для него будут выданы строчки для всех. Обычно это для суперпользователя, у которого проблем с правами нет. Более строго проверять наличие привилегии именно у текущего пользователя:

SELECT * FROM INFORMATION_SCHEMA.user_privileges WHERE GRANTEE=CONCAT('\'',REPLACE(CURRENT_USER(),'@','\'@\''),'\'') AND PRIVILEGE_TYPE='SELECT';

Неактивен

 

#16 24.01.2016 15:59:27

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

Спасибо, вы мне очень помогли.

Неактивен

 

#17 25.01.2016 14:24:29

bobanman
Участник
Зарегистрирован: 22.01.2016
Сообщений: 13

Re: Запрос и привилегии

rgbeast написал:

Если это непривилегированный юзер, то так. Если зайдете по юзером, который имеет право видеть других, то для него будут выданы строчки для всех. Обычно это для суперпользователя, у которого проблем с правами нет. Более строго проверять наличие привилегии именно у текущего пользователя:

SELECT * FROM INFORMATION_SCHEMA.user_privileges WHERE GRANTEE=CONCAT('\'',REPLACE(CURRENT_USER(),'@','\'@\''),'\'') AND PRIVILEGE_TYPE='SELECT';

А может теоретически этот запрос выдать более одной строки?

Неактивен

 

#18 25.01.2016 23:10:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Запрос и привилегии

Теоретически не должен, но кто его знает.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson