Erteilen Sie Berechtigungen für Ansichten, verweigern Sie die Auswahl für Tabellen

9

Ich habe einen MySQL-Benutzer und möchte, dass NUR die gewünschten Ansichten und keine andere Tabelle in der Datenbank angezeigt werden. Ich habe diesem Benutzer Berechtigungen nur für bestimmte Ansichten wie folgt erteilt:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

Wenn ich eine show grants;Anweisung mache, kann ich diese Berechtigungen nur wie erwartet sehen. Ich möchte jedoch, dass dieser Benutzer NUR die Ansichten und nicht die Tabellen abfragt, die sich auf diese Ansichten beziehen, aber ich kann keinen Weg finden, dies zu tun. Es scheint so zu sein, dass, wenn ich möchte, dass der Benutzer eine Auswahl für die Ansicht vornimmt, die Auswahl auch für die Tabelle gewährt werden muss, oder irre ich mich?

Wenn ich die selectAnweisung in den restlichen Tabellen ablehne und in der Befehlszeile versuche, eine Auswahl zu treffen, wird Folgendes angezeigt:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'

Das ist es, was ich zwar will, aber ich wurde auch abgelehnt, wenn ich die Ansichtsdaten auswähle.

Gibt es eine Möglichkeit, dem Benutzer nur die Ansichten und nicht die Tabellen zur Verfügung zu stellen?

Metafaniel
quelle

Antworten:

6

Sie müssen die Ansicht als Tabelle behandeln. Das Informationsschema funktioniert bereits

Wenn du läufst

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

Sie erhalten alle Ansichten.

Gewähren Sie dem Benutzer einfach SELECT für die Ansicht wie folgt

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

Sobald Sie dies getan haben, sollten Sie SELECT-Zugriff auf die Tabelle haben.

Um sicherzugehen, führen Sie SHOW GRANTS FOR 'thisUser'@'localhost';

Sie sollten auch sehen können, welchem ​​Zugriff auf Tabellenebene gewährt wird 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

Sie können auch sehen, auf welchen Benutzer Zugriff auf Tabellenebene möglich ist myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

VERSUCHE ES !!!

RolandoMySQLDBA
quelle
Hey, du hast es geschafft! Vielen Dank! Ich konnte keine eigene Lösung finden! Vielen Dank!
Metafaniel
5

Ich weiß, dass dies jetzt alt ist, aber hier ist, was dieses Problem für mich gelöst hat ...

Die Antwort war mit der Syntax "SQL SECURITY".

In meiner ursprünglichen Ansichtsdefinition war SQL SECURITY auf "INVOKER" eingestellt. Dies bedeutete, dass der Benutzer gezwungen war, Auswahlberechtigungen sowohl für die Ansicht als auch für die Tabelle zu haben.

Wenn ich die SQL-SICHERHEIT in "DEFINER" geändert habe, kann ich dem Benutzer nur in der Ansicht die Berechtigung zum Auswählen erteilen.

John
quelle