web-dev-qa-db-fra.com

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

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 un show grants; instruction 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 la déclaration select 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?

9
Metafaniel

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 de niveau table est accordé à 'thisUser'@'localhost'

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

Vous pouvez également voir quel utilisateur dispose d'un accès de niveau table à myDatabase.fordibenForYouTable

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

ESSAIE !!!

6
RolandoMySQLDBA

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

La réponse a été 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 peux accorder à l'utilisateur une autorisation de sélection uniquement sur la vue.

5
John