Je me hurte à un problème relativement génant. A savoir que dans ma version de mySQL (5.0.37), pour permettre à un utilisateur de consulter une vue, il doit avoir les droits d'accès en "SELECT" sur les tables permettants de générer cette vue, alors que je lui ai donné les droit d'accès "SELECT, SHOW VIEW" sur la vue en question.
Je trouve cela étrange que les droits des objets de type "vue" ne soient pas dissociés des droits sur les tables dont sont issues les données de la vue.
Pour information cela fonctionnait dans la version 5.0.15
Donc ma question, en plus clair est concis est : comment peut on donner des droit d'accès à une vue sans pour autant donner des droits d'accès aux tables ayant permis de générer cette vue
J'ai utilisé un compte intermédiaire, compte qui sera connu que de l'administrateur.
Donc voila comment j'ai procédé :
1 - Création des comptes :
'view_user'@'localhost' sera le compte qui a les droits en SELECT sur la base db_source et sur la base db_view. C'est lui qui sera le DEFINER de toutes les requêtes à l'exception de une.
'mon_user'@'localhost' est le compte de l'utilisateur qui aura les droits SELECT et SHOW VIEW sur la base db_view, plus le droit de SELECT sur la table db_source.utilisateur. C'est ce compte là qui sera utilisé pour créer la vue db_view.utilisateur qui ne contiendra qu'un seul enregistrement correspondant à son identifiant unique utilisé dans toute la base de données.
Code :
GRANT SELECT ON medw.* TO 'view_user'@'localhost' IDENTIFIED BY '******';
GRANT SELECT, SHOW VIEW ON db_view.* TO 'view_user'@'localhost' IDENTIFIED BY '******';
GRANT SELECT ON db_source.utilisateur TO 'mon_user'@'localhost' IDENTIFIED BY '******';
GRANT SELECT, SHOW VIEW ON db_view.* TO 'mon_user'@'localhost' IDENTIFIED BY '******';
2 - création de la première vue. C'est la seule qui nécessite un droit d'accès à une table de la base db_source, sachant que c'est la table user et qu'on peut limiter les accès uniquement à une colonne, sont identifiant unique :
Code :
CREATE OR REPLACE DEFINER = CURRENT_USER SQL SECURITY INVOKER VIEW db_view.utilisateur AS
SELECT id
FROM db_source.utilisateur
WHERE username = SUBSTRING_INDEX(CURRENT_USER(), '@', 1);
On note DEFINER = CURRENT_USER et SQL SECURITY INVOKER qui signifient que ce sont les droits de 'mon_user'@'localhost' qui seront utilisés comme créateur de la vue [DEFINER] et comme exécutant de la vue [SQL SECURITY INVOKER]
En suite on crée les autres vues avec les options DEFINER = 'view_user'@'localhost' et SQL SECURITY DEFINER qui signifie qu'on force le fait que c'est le compte 'view_user'@'localhost' qui a définie la vue [DEFINER] et qu'on utilise ce même compte pour exécuter cette vue, même si c'est le compte 'mon_user'@'localhost' qui est utlisé pour exécuter les requètes. Et comme la vue db_view.utilisateur me sert dans toutes mes jointures, c'est elle qui me permet de ne remonter que les données spécifique de l'utilisateur et de maintenir ainsi la confidentialité des données qu'il n'a pas à consulter.