Предоставяне на разрешения на ниво таблица
Можете да създадете потребител с разрешения на ниво таблица в MySQL, като изпълните следното:
-
Свържете се с MySQL като потребител с Create_user_priv и Grant_priv. Определете кои потребители имат тези привилегии, като изпълните следната заявка. Вашият потребител вече ще се нуждае от привилегията SELECT на MySQL.user, за да изпълни заявката.
SELECT User, Host, Super_priv, Create_user_priv, Grant_priv from mysql.user WHERE Create_user_priv = 'Y' AND Grant_Priv = 'Y';
-
Изпълнете следната заявка, за да генерирате изразите GRANT за вашия ограничен потребител. Заменете „mydatabase“, „myuser“ и „myhost“ с конкретна информация за вашата база данни.
Обърнете внимание, че кавичките около myuser и mypassword са две единични кавички, а не двойни. Знаците около myhost и ,TABLE_NAME са обратни (клавишът се намира под клавиша за излизане на клавиатурата ви).
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON mydatabase.`', TABLE_NAME, '` to ''myuser''@`myhost`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mydatabase';
Например, ако искате да свържете потребителя „chartio_read_only“ към вашата база данни „Reports“ с помощта на клиента chartio_connect, ще изпълните следното:
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON Reports.`', TABLE_NAME, '` to ''chartio_read_only''@`localhost`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Reports';
Ако искате да свържете потребителя ‘chartio_direct_connect’ към вашата база данни ‘Analytics’ чрез директна връзка от сървърите на Chartio, трябва да изпълните следното:
SELECT CONCAT('GRANT SELECT, SHOW VIEW ON Analytics.`', TABLE_NAME, '` to ''chartio_direct_connect''@`52.6.1.1`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Analytics';
-
Заявката трябва да се получи подобно на следното:
GRANT SELECT, SHOW VIEW ON mydatabase.`Activity` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Marketing` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Operations` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Payments` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Plans` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Services` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Subscriptions` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Users` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Visitors` to 'myuser'@`myhost`;
-
Изберете изразите само за таблиците, до които искате да предоставите достъп, и изпълнете тези заявки. Например, ако искаме да предоставим достъп само до таблицата Users and Visitors, ще изпълним:
GRANT SELECT, SHOW VIEW ON mydatabase.`Users` to 'myuser'@`myhost`; GRANT SELECT, SHOW VIEW ON mydatabase.`Visitors` to 'myuser'@`myhost`;
-
Дайте на потребителя сигурна парола.
SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
или
SET PASSWORD FOR 'chartio_direct_connect'@`52.6.1.1` = PASSWORD('top$secret');
Сега можете безопасно да получите достъп до вашата база данни с този потребител и да сте сигурни, че има разрешения само за посочените таблици.
Предоставяне на разрешения на ниво колона
Процедурата за предоставяне на разрешения на ниво колона на конкретна таблица е много подобна на предоставянето на разрешения на ниво таблица.
-
Генерирайте изразите GRANT за разрешения на ниво колона, като използвате следната заявка:
SELECTCONCAT('GRANT SELECT (`', COLUMN_NAME, '`), SHOW VIEW ON mydatabase.`', TABLE_NAME, '` to ''myuser''@`myhost`;') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'mydatabase' AND TABLE_NAME = 'mytable';
Например, ако искате да свържете потребителя „chartio_read_only“ към конкретни колони в таблицата „Потребители“ на базата данни „Отчети“ с помощта на клиента chartio_connect, трябва да изпълните следното:
SELECTCONCAT('GRANT SELECT (`', COLUMN_NAME, '`), SHOW VIEW ON Reports.`', TABLE_NAME, '` to ''chartio_read_only''@`localhost`;') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'Reports' AND TABLE_NAME = 'Users';
-
Заявката трябва да доведе до нещо подобно на следното:
GRANT SELECT (`User_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Campaign_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Created_Date`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Company`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`City`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`State`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Zip`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Phone_Number`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Credit_Card`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`;
-
Изберете само изразите за колоните, до които искате да предоставите достъп, и изпълнете тези заявки. Например, ако искаме да предоставим достъп само до колоните „User_ID“ и „Company“, ще изпълним:
GRANT SELECT (`User_ID`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`; GRANT SELECT (`Company`), SHOW VIEW ON Reports.`Users` to 'chartio_read_only'@`localhost`;
-
Дайте на потребителя сигурна парола.
SET PASSWORD FOR 'chartio_read_only'@`localhost` = PASSWORD('top$secret');
За повече информация вижте документацията на MySQL.