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 :

  1. Droits nécessaires :

    • Employés : INSERT, UPDATE, et SELECT pour leurs actions.
    • Clients : Vues pour filtrer leurs propres données.
  2. 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.

  3. 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

  1. Raisonnement : Une vue est adaptée lorsqu’une action correspond à un SELECT simple sans paramètres.

  2. 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é.
  1. 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

  1. 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

  1. Programmeur :

    • Crée les vues et procédures.
    • Accorde les droits nécessaires.
  2. Employé :

    • Ajoute un nouveau village :
      INSERT INTO Village (idv, ville, activite, prix, capacite) VALUES (200, 'Nice', 'Voile', 300, 100);
      
  3. 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;
      

3j. Jeu de la confidentialité

Ce jeu est optionnel et basé sur des simulations, mais il suit la même logique que ci-dessus.

Pierre-Henri Paris
Pierre-Henri Paris
Associate Professor in Artificial Intelligence

My research interests include Knowlegde Graphs, Information Extraction, and NLP.