Accorder des autorisations sur les vues, refuser la sélection sur les tables

9

J'ai un utilisateur MySQL et je veux qu'il affiche UNIQUEMENT les vues que je veux et pas toute autre table dans la base de données. J'ai accordé à cet utilisateur des autorisations uniquement sur certaines vues, comme suit:

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

Si je fais une show grants;déclaration, je ne peux voir ces autorisations que comme prévu. Cependant, j'aimerais que cet utilisateur interroge JUSTE les vues et non les tables liées à ces vues, mais je ne trouve pas de moyen de le faire. Il semble que si je veux que l'utilisateur fasse une sélection sur la vue, la sélection doit également être accordée pour la table, ou je me trompe?

Si je refuse l' selectinstruction dans le reste des tableaux, et dans la ligne de commande, j'essaie de faire une sélection, j'ai obtenu ce qui suit:

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

C'est ce que je veux en effet, mais on m'a également refusé si je sélectionne les données de vue.

Existe-t-il un moyen de mettre à la disposition de l'utilisateur uniquement les vues et non les tables?

Metafaniel
la source

Réponses:

6

Vous devrez traiter la vue comme une table. Le schéma_information fait déjà

Si vous courez

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

vous obtenez toutes les vues.

Accordez simplement SELECT sur la vue à l'utilisateur comme suit

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

Une fois que vous faites cela, vous devriez avoir un accès SELECT à la table.

Pour vous en assurer, exécutez SHOW GRANTS FOR 'thisUser'@'localhost';

Vous devriez également pouvoir voir quel accès au niveau de la table est accordé à 'thisUser'@'localhost'

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

Vous pouvez également voir à quel utilisateur a accès au niveau de la table myDatabase.fordibenForYouTable

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

ESSAIE !!!

RolandoMySQLDBA
la source
Hé, tu l'as fait! Merci! Je n'ai pas trouvé la solution pour moi! Merci beaucoup!
Metafaniel
5

Je sais que c'est vieux maintenant, mais voici ce qui a résolu ce problème pour moi ...

La réponse était avec la syntaxe "SQL SECURITY".

ma définition de vue d'origine avait SQL SECURITY réglé sur "INVOKER". Cela signifiait que l'utilisateur était obligé d'avoir une autorisation de sélection sur la vue et la table.

Lorsque j'ai changé la SÉCURITÉ SQL pour qu'elle soit "DÉFINISSEUR", je ne peux accorder à l'utilisateur une autorisation de sélection que sur la vue.

John
la source