previous up next

L'implémentation d'un gestionnaire de sécurité

Pour créer son gestionnaire de sécurité, on dérive la classe SecurityManager. Dans cette classe, il est possible de redéfinir les méthodes qui sont utilisées pour évaluer les accès aux ressources. Par défaut, l'accès est interdit. Ces fonctions ne retournent rien, mais lèvent une exception SecurityException en cas de non autorisation.

Les méthodes de SecurityManager
Méthode Autorisation
checkAccess(Thread g) Accéder à ce thread.
checkExit(int status) Exécuter un System.exit().
checkExec(String cmd) Faire un exec de ce processus.
checkRead(String file) Lire ce fichier.
checkWrite(String file) Ecrire dans ce fichier.
checkDelete(String file) Détruire ce fichier.
checkConnect(String host,int port) Connecter une socket à cette machine.
checkListen(int port) Créer un serveur et sa socket d'écoute.
checkAccept(String host,int port) Accepter cette connection.
checkPropertyAccess(String key) Accéder aux propriétés systè-me.
checkTopLevelWindow(Object window) Créer cette fenêtre.

Voici un petit exemple de gestionnaire de sécurité.

class gestionnaire extends SecurityManager
{
        private boolean ok() throws IOException
        {
                DataInputStream lecture;
		
                lecture = new DataInputStream (System.in);
                return (lecture.readLine().equals("y"));
        }
	
        public void checkRead(String file) {}
        public void checkDelete(String file)
        {
                try
                {
                        System.out.println("Effacer " + file 
                        + " ? ");
		
                        if (!ok())
                                throw new SecurityException(
                                "Effacement de " + file + 
                                " refuse");
                }
                catch (IOException e) {}
        }
        public void checkPropertyAccess(String key) {}
}

Ce gestionnaire de sécurité permet l'accès en lecture au fichier, l'accès aux propriétés système et demande l'autorisation pour effacer un fichier. Toute autre requête est refusée.

On peut ensuite l'essayer avec la classe suivante.

public class gest
{
        public static void main(String[] args)
        {
                System.setSecurityManager(new gestionnaire());
		
                new File("rien.txt").delete();
        }
}

Ici on fait tout de suite appel à la fonction delete, mais le gestionnaire interviendrait de la même manière si l'appel de delete était fait par une autre classe.

Remarque : Si ce gestionnaire peut paraître raisonnable du point de vue de la destruction de fichier, il peut aussi s'avèrer être très gênant dans le cas où l'application voudrait effacer de nombreux fichiers.


Olivier Lux
30-03-1999