## Introdución a los Controladores de Seguridad

Toda aplicación Java puede tener su propio objeto controlador de seguridad que actúa como un guardia de seguridad a tiempo completo. La clase SecurityManager del paquete java.lang es una clase abstracta que proporciona el interface de programación y una implementación parcial para todos los controladores de seguridad de Java.

Por defecto una aplicación no tiene controlador de seguridad. Esto es, el sistema de ejecución de Java no crea automáticamente un controlador de seguridad para cada aplicación. Entonces, por defecto, una aplicación permite todas las operaciones que están sujetas a las restricciones de seguridad.

Para cambiar este comportamiento indulgente, una aplicación debe crear e instalar su propio controlador de seguridad. Aprenderás como crear un controlador de seguridad en Escribir un Controlador de Seguridad, y como instalarlo en Instalar un Controlador de Seguridad.

Nota: Los navegadores existentes y los visualizadores de applets crean su propio controlador de seguridad cuando arrancan. Así, un applet está sujeto a las restricciones de acceso siempre que sean impuestas por el controlador de seguridad de una aplicación particular en la que el applet se está ejecutando.

Puedes obtener el controlador de seguridad actual de una aplicación utilizando el método getSecurityManager() de la clase System.

    SecurityManager appsm = System.getSecurityManager();

Observa que getSecurityManager() devuelve null si no hay ningún controlador de seguridad actual en la aplicación por lo que debería asegurarse de que tiene un objeto válido antes de llamar a cualquiera de sus métodos.

Una vez que tienes el controlador de seguridad, puedes pedir permiso para permitir o prohibir ciertas operaciones. De hecho, muchas de las clases en los paquetes de Java hacen esto. Por ejemplo, el método System.exit(), que finaliza el interprete Java, utiliza el método checkExit() del controlador de seguridad para aprobar la operación de salida:

    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkExit(status);
    }
    . . .
    // El código continúa aquí si  checkedExit() retorna

Si el controlador de seguridad aprueba la operación de salida, el checkExit() retorna normalmente. Si el controlador de seguridad prohibe la operación, el checkExit() lanza una SecurityException. De esta forma, el controlador de seguridad permite o prohibe una operación potecialmente dañina antes de que pueda ser completada.

La clase SecurityManager define muchos otros métodos utilizados para verificar otras clases de operaciones. Por ejemplo, el método checkAccess() verifica los accesos a los threads, y checkPropertyAccess() verifica el acceso a la propiedad especificada. Cada operación o grupo de operaciones tiene su propio método checkXXX().

Además, el conjunto de métodos checkXXX() representa el conjunto de operaciones de las clases de los paquetes Java y el sistema de ejecución de Java que ya están sujetos a la protección del controlador de seguridad. Por eso, normalmente, sus código no tendrá que llamar a ningún método checkXXX() -- las clases de los paquetes de Java hacen esto por usted a un nivel lo suficientemente bajo que cualquier operación representada por un método checkXXX() ya está protegida. Sin embargo, cuando escribas tu propio controlador de seguridad, podrías tener que sobreescribir los métodos checkXXX() de SecurityManager para modificar la política de seguridad de las operaciones específicas, o podría tener que añadir algunos por ti mismo para poner otras clases de operaciones para el escurtinio del controlador de seguridad.

Decidir los Métodos a Sobreescribir de SecurityManager explica las operaciones o grupos de operaciones que cada método checkXXX() de la clase SecurityManager está diseñado para proteger.

Ozito