## Instalar un Controlador de Seguridad

Una vez que has terminado de escribir tu subclase de SecurityManager, puedes instalarla como el controlador de seguridad actual de tu aplicaicón. Puedes hacer esto utilizando el método setSecurityManager() de la clase System.

Aquí tienes una pequeña aplicación de prueba, SecurityManagerTest, que instala la clase PasswordSecurityManager de la página anterior como el controlador de seguridad actual. Luego, para verificar que el controlador de seguridad está en su lugar y es operacional, esta aplicación abre dos ficheros -- uno para leer y otro para escribir -- y copia el contenido del primero en el segundo.

El método main() comienza con la instalación de nuevo controlador de seguridad:

    try {
        System.setSecurityManager(new PasswordSecurityManager("Booga Booga"));
    } catch (SecurityException se) {
        System.out.println("SecurityManager already set!");
    }

La línea en negrita del código anterior crea un nuevo ejemplar de la clase PasswordSecurityManager con la password "Booga Booga". Este ejemplar es pasado al método setSecurityManager() de la clase System, que instala el objeto como el controlador de seguridad por defecto para la aplicación que se está ejecutando. Este controlador de seguridad permanecerá efectivo durante el la ejecución de esta aplicación.

Sólo se puede seleccionar un vez el controlador de seguridad de una aplicación. En otras palabras, una aplicación Java sólo pude invocar una vez a System.setSecurityManager() durante su ciclo de vida. Cualquier intento posterior de instalar un controlador de seguridad dentro de una aplicación Java resultará en una SecurityException.

El resto del programa copia el contenido de este fichero inputtext.txt en un fichero de salida llamado outputtext.txt. Es sólo un texto que verifica que PasswordSecurityManager se ha instalado de forma apropiada.

    try {
     DataInputStream fis = new DataInputStream(new FileInputStream("inputtext.txt"));
        DataOutputStream fos = new DataOutputStream(new FileOutputStream("outputtext.txt"));
        String inputString;
        while ((inputString = fis.readLine()) != null) {
            fos.writeBytes(inputString);
            fos.writeByte('\n');
        }
        fis.close();
        fos.close();
    } catch (IOException ioe) {
        System.err.println("I/O failed for SecurityManagerTest.");
    }

Las líneas en negrita del código anterior son los accesos al sistema de ficheros restringido. Estas llamadas a método resultan en una llamada al método checkAccess() del PasswordSecurityManager.

### Ejecutar el Programa de Prueba

> Cuando ejecutes la aplicación SecurityManagerTest te pedirá dos veces la password: una cuando la aplicación abre el fichero de entrada y otra cuando abre el fichero de salida. Si tecleas la password correcta, se permite el acceso -- el objeto fichero -- y la aplicación prosigue con la siguiente sentencia. Si tecleas una password incorrecta, checkXXX() lanza una SecurityException, que la aplicación no intenta capturar por lo que aplicación termina.

> Este es un ejemplo de la salida de aplicación cuando se teclea la password correcta la primera vez, pero no la segunda:

>     What's the secret password?
>     Booga Booga
>     What's the secret password?
>     Wrong password
>     java.lang.SecurityException: Not Even!
>             at PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46)
>             at java.io.FileOutputStream.(FileOutputStream.java)
>             at SecurityManagerTest.main(SecurityManagerTest.java:15)

> Observa que el mensaje de error que muestra la aplicación es el mensaje contenido en el método checkWrite(String).

### También puede ver:

> java.lang.System

Ozito