Exercice 1 : Manipulation des outils
1a. Outils SQL
Droit d’insertion dans la table Village
:
-- Accorder le droit d'insertion
GRANT INSERT ON Village TO employe_app;
-- Basculer vers l'utilisateur employé pour tester
CONN employe_app/password
-- Tester l'insertion
INSERT INTO Village (idv, ville, activite, prix, capacite) VALUES (100, 'Paris', 'Cyclisme', 100, 20);
-- Revenir au programmeur pour retirer le droit
CONN programmer/password
REVOKE INSERT ON Village FROM employe_app;
-- Revenir à l'employé pour vérifier que le droit est retiré
CONN employe_app/password
-- Cette commande doit générer une erreur
INSERT INTO Village (idv, ville, activite, prix, capacite) VALUES (101, 'Rome', 'Natation', 200, 50);
1b. Encapsulation en PL/SQL
Encapsulation et droits associés :
-- Accorder le droit d'exécuter la procédure
GRANT EXECUTE ON traitement2 TO employe_app;
-- Basculer vers l'utilisateur employé pour tester
CONN employe_app/password
-- Tester l'exécution de la procédure
BEGIN
traitement2(<client_id>, '<ville>', <jour>);
END;
-- Vérifier si l'encapsulation est respectée
-- L'utilisateur employé ne doit pas avoir accès direct aux tables utilisées dans la procédure
SELECT * FROM Sejour; -- Cette commande doit générer une erreur.
Exercice 2 : Application de l’outil GRANT sur table
Droits minimaux pour chaque acteur :
Pour les employés :
-- Droits pour créer et modifier les villages
GRANT INSERT, UPDATE ON Village TO employe_app;
-- Droit de consulter les villages
GRANT SELECT ON Village TO employe_app;
-- Droit de consulter les séjours
GRANT SELECT ON Sejour TO employe_app;
Pour les clients :
-- Droit de consulter les villages sans séjours (sans la capacité)
CREATE VIEW VueVillagesSansSejours AS
SELECT idv, ville, activite FROM Village WHERE idv NOT IN (SELECT idv FROM Sejour);
GRANT SELECT ON VueVillagesSansSejours TO client_app;
-- Droits pour consulter uniquement leurs propres données
CREATE VIEW VueClientSejour AS
SELECT * FROM Sejour WHERE idc = "Alice";
GRANT SELECT ON VueClientSejour TO client_app;
CREATE VIEW VueClientDonnees AS
SELECT * FROM Client WHERE idc = "Alice";
GRANT SELECT ON VueClientDonnees TO client_app;
Actions interdites possibles avec les GRANT directs :
Si un droit direct GRANT SELECT ON Client
est accordé, un client pourrait voir les données des autres clients. Pour éviter cela :
-- Créer une vue filtrant les données selon l'utilisateur
CREATE VIEW VueClientPropre AS
SELECT * FROM Client WHERE idc = "Alice";
-- Accorder les droits sur la vue uniquement
GRANT SELECT ON VueClientPropre TO client_app;
-- Tester en tant que client
CONN client_app/password
SELECT * FROM VueClientPropre; -- Affiche uniquement les données de l'utilisateur connecté.
SELECT * FROM Client; -- Cette commande doit générer une erreur.
Voici la suite de la correction pour l’Exercice 3 : Synthèse.
Exercice 3 : Synthèse
3a. Rappel des actions du cahier des charges avec leurs acteurs
Les actions du cahier des charges sont :
- Employés :
- Créer des villages.
- Modifier les villages (sauf l’identifiant, la ville et le prix).
- Consulter tous les séjours.
- Exécuter le traitement 3 (suppression des séjours avant une date).
- Clients :
- S’inscrire (traitement 1).
- Acheter un séjour (traitement 2).
- Consulter les villages sans séjours (sans afficher la capacité).
- Consulter leurs propres données dans les tables.
3b. Création des comptes utilisateurs
-- Création d'un compte générique pour les clients
CREATE USER client_app IDENTIFIED BY password;
-- Création d'un compte pour les employés
CREATE USER employe_app IDENTIFIED BY password;
3c. Révocation des droits existants
-- Lister les droits existants sur les tables
SELECT * FROM DBA_TAB_PRIVS -- en admin sinon un utilisateur normal peut utiliser USER_TAB_PRIVS
WHERE TABLE_NAME IN ('CLIENT', 'VILLAGE', 'SEJOUR')
AND GRANTEE IN ('CLIENT_APP', 'EMPLOYE_APP');
-- Révoquer les droits trouvés
REVOKE ALL PRIVILEGES ON Client FROM client_app, employe_app;
REVOKE ALL PRIVILEGES ON Village FROM client_app, employe_app;
REVOKE ALL PRIVILEGES ON Sejour FROM client_app, employe_app;
3d. Implémentation des droits exacts avec les GRANT
Pour chaque action :
Droits nécessaires :
- Employés :
INSERT
,UPDATE
, etSELECT
pour leurs actions. - Clients : Vues pour filtrer leurs propres données.
- Employés :
Exemple d’action interdite : Si
GRANT SELECT ON Client TO client_app
est utilisé, un client pourrait voir les données des autres clients. Une vue est nécessaire pour limiter l’accès.Conclusion : Le
GRANT
direct est insuffisant pour respecter les contraintes de confidentialité dans certains cas (comme pour les clients).
3e. Utilisation des vues pour gérer les actions
Raisonnement : Une vue est adaptée lorsqu’une action correspond à un
SELECT
simple sans paramètres.Exemple : Vue pour les données des clients :
-- Créer une vue pour filtrer les données des clients
CREATE VIEW VueClientDonnees AS
SELECT idc, nom, age, avoir FROM Client WHERE idc = "Alice";
-- Accorder les droits sur cette vue
GRANT SELECT ON VueClientDonnees TO client_app;
-- Tester en tant que client
CONN client_app/password
SELECT * FROM VueClientDonnees; -- Affiche uniquement les données du client connecté.
- Actions interdites via la vue :
Si la vue est mal conçue (e.g., sans filtre sur
USER
), des données d’autres clients pourraient être exposées. Cela est évité ici.
3f. Encapsulation par procédure PL/SQL
- Exemple pour le traitement 2 (achat d’un séjour) :
-- Création de la procédure
CREATE OR REPLACE PROCEDURE acheter_sejour(
p_idc IN NUMBER,
p_ville IN VARCHAR2,
p_jour IN NUMBER,
p_idv OUT NUMBER,
p_ids OUT NUMBER,
p_activite OUT VARCHAR2
) AS
BEGIN
-- Logique du traitement ici (simplifié)
SELECT idv, activite INTO p_idv, p_activite
FROM Village
WHERE ville = p_ville
ORDER BY prix DESC FETCH FIRST 1 ROW ONLY;
INSERT INTO Sejour(ids, idc, idv, jour)
VALUES (SEQ_SEJOUR.NEXTVAL, p_idc, p_idv, p_jour);
-- Mettre à jour l'avoir du client
UPDATE Client SET avoir = avoir - (SELECT prix FROM Village WHERE idv = p_idv)
WHERE idc = p_idc;
-- Retourner l'ID du séjour créé
SELECT MAX(ids) INTO p_ids FROM Sejour WHERE idc = p_idc;
END;
-- Accorder les droits d'exécution
GRANT EXECUTE ON acheter_sejour TO client_app;
-- Tester en tant que client
CONN client_app/password
DECLARE
idv NUMBER;
ids NUMBER;
activite VARCHAR2(50);
BEGIN
acheter_sejour(1, 'Paris', 100, idv, ids, activite);
DBMS_OUTPUT.PUT_LINE('Village ID: ' || idv || ', Séjour ID: ' || ids || ', Activité: ' || activite);
END;
3g. Preuve d’exprimabilité des actions par les outils
Chaque action peut être exprimée avec :
- GRANT : Pour les accès de base.
- Vues : Pour les sélections filtrées.
- Encapsulation : Pour les traitements complexes avec règles métier.
Exemple :
-- La vue suivante simule un accès restreint aux clients
CREATE VIEW VueClientsMajoritaires AS
SELECT idc, nom FROM Client WHERE age >= 18;
GRANT SELECT ON VueClientsMajoritaires TO employe_app;
-- Tester en tant qu'employé
CONN employe_app/password
SELECT * FROM VueClientsMajoritaires; -- Montre uniquement les clients majeurs.
3i. Simulation chronologique avec les rôles
Programmeur :
- Crée les vues et procédures.
- Accorde les droits nécessaires.
Employé :
- Ajoute un nouveau village :
INSERT INTO Village (idv, ville, activite, prix, capacite) VALUES (200, 'Nice', 'Voile', 300, 100);
- Ajoute un nouveau village :
Client :
- S’inscrit :
BEGIN traitement1('Dupont', 30); END;
- Achète un séjour :
BEGIN acheter_sejour(1, 'Nice', 101, :p_idv, :p_ids, :p_activite); END;
- S’inscrit :
3j. Jeu de la confidentialité
Ce jeu est optionnel et basé sur des simulations, mais il suit la même logique que ci-dessus.