## Escribir un Controlador de Seguridad

Para escribir tu propio controlador de seguridad, debes crear una subclase de la clase SecurityManager. Esta subclase sobreescribe varios método de SecurityManager para personalizar las varificaciones y aprobaciones necesarias para una aplicación Java.

Esta página te lleva a través de un controlador de seguridad de ejemplo que restringe la lectura y escritura en el sistema de ficheros. Para obtener la aprobación del controlador de seguridad, un método que abra un fichero para leer invoca uno de los métodos checkRead() de SecurityManager, un método que abre un fichero para escribir invoca a uno de los métodos checkWrite() se SecurityManager. Si el controlador de seguridad aprueba la operación el método checkXXX() retorna nomalmente, de otra forma checkXXX() lanza una SecurityException.

Para imponer una polñitica restrictiva en los accesos al sistema de ficheros, nuestro ejemplo debe sobreescribir los métodos checkRead() y checkWrite() de SecurityManager. SecurityManager proporciona tres versiones de checkRead() y dos versiones de checkWrite(). Cada una de ellas debería verificar si la aplicación puede abrir un fichero para I/O. Una política implementada frecuentemente en los navegadores para que los applets cargados a través de la red no puedan leer o escribir en el sistema local de ficheros a menos que el usuario lo apruebe,

La política implementada por nuestro ejemplo le pide al usuario una password cuando la aplicación intenta abrir un fichero para leer o escribir. Si la password es correcta se permite el acceso.

Todos los controladores de seguridad deben ser una subclase de SecurityManager. Así, nuestra PasswordSecurityManager desciende de SecurityManager.

    class PasswordSecurityManager extends SecurityManager {
        . . .
    }

Luego, PasswordSecurityManager declara un ejemplar de la variable privada password para contener el password que el usuario debe introducir para poder permitir el acceso al sistema de ficheros restringido. La password se selecciona durante la construcción:

    PasswordSecurityManager(String password) {
        super();
        this.password = password;
    }

El siguiente método en la clase PasswordSecurityManager es un método de ayuda privado llamado accessOK(). Este método le pide al usuario una password y la verifica. Si el usuairo introduce una password válida, el método devuelve true, de otra forma devuelve false.

    private boolean accessOK() {
        int c;
        DataInputStream dis = new DataInputStream(System.in);
        String response;

        System.out.println("What's the secret password?");
        try {
            response = dis.readLine();
            if (response.equals(password))
                return true;
            else
                return false;
        } catch (IOException e) {
            return false;
        }
    }

Finalmente al final de la clase PasswordSecurityManager hay tres métodos checkRead() y dos métodos checkWrite() sobreescritos:

    public void checkRead(FileDescriptor filedescriptor) {
        if (!accessOK())
            throw new SecurityException("Not a Chance!");
    }
    public void checkRead(String filename) {
        if (!accessOK())
            throw new SecurityException("No Way!");
    }
    public void checkRead(String filename, Object executionContext) {
        if (!accessOK())
            throw new SecurityException("Forget It!");
    }
    public void checkWrite(FileDescriptor filedescriptor) {
        if (!accessOK())
            throw new SecurityException("Not!");
    }
    public void checkWrite(String filename) {
        if (!accessOK())
            throw new SecurityException("Not Even!");
    }

Todos los métodos checkXXX() llaman a accessOK() para pedirle al usuario la password. Si el acceso no es OK, entonces checkXXX() lanza una SecurityException. De otra froma, checkXXX() returna normalmente. Observa que SecurityException es una excepción en tiempo de ejecución, y no necesita ser declarada en la clausula throws de estos métodos.

checkRead() y checkWrite() son sólo unos pocos de los muchos métodos checkXXX() de SecurityManager que verifican varias clases de operaciones. Puedes sobreescribir o añadir cualquier número de método checkXXX() para implementar tu propia política de seguridad. No necesitas sobreescribir todos los métodos checkXXX() de SecurityManager, sólo aquellos que quieras personalizar. Sin embargo, la implementación por defecto proporcionada por la clase SecurityManager para todos los métodos checkXXX() lanza una SecurityException. En otras palabras, por defecto, la clase SecurityManager prohibe todas las operaciones que están sujetas a las restricciones de seguridad. Por lo que podrías encontrar que tienes que sobreescribir muchos métodos checkXXX() para obtener el comportamiento deseado.

Todos los métodos checkXXX() de la clase SecurityManager operan de la misma forma:

- Si el acceso está permitido, el método retorna.
- Si el acceso no está permitido, el método lanza una SecurityException.

Asegurate de que implementas de esta forma tus métodos checkXXX() sobreescritos.

Bien, esta es nuestra subclase de SecurityManager. Como puedes ver implementar un controlador de seguridad es sencillo, sólo :

- Crea una subclase de SecurityManager.
- Sobreescribe unos cuantos métodos.

El truco está en determinar los métodos que se deben sobreescribir para implementar tu política de seguridad. Decidir que Métodos Sobreescribir de SecurityManager te ayudará a decidir los métodos que deberás sobreescribir dependiendo de los tipos de operaciones que quieras proteger. La página siguiente te enseña como instalar la clase PasswordSecurityManager como el controlador de seguridad de su aplicación Java.

### También puede ver

> java.lang.SecurityManager
> java.lang.SecurityException

Ozito