2008-11-22 10 views
6

Tengo una aplicación Java y me gustaría que sea extensible. Para crear una extensión, los desarrolladores de nuestra empresa escribirán una clase Java que implemente una determinada interfaz. También pueden querer escribir clases auxiliares asociadas. Me gustaría cargar estas extensiones en la aplicación sin una interrupción.¿Cómo otorgar diferentes permisos a varias clases de Java?

me gustaría limitar lo que esta clase puede hacer a los siguientes:

  1. métodos de llamadas en la API de la aplicación (esto será un parámetro al constructor)
  2. crear instancias de otros objetos dentro del mismo paquete (para que el autor de la clase de extensión pueda usar otras clases para realizar el trabajo).

Cuando se invoca la clase, el objeto API que se transfiere ya tendrá un "cliente" definido y almacenado como una variable miembro. Utilizará esto para limitar el acceso a través de la API a los datos de ese cliente.

No quiero que estas clases hagan cosas como acceder a la base de datos, escribir en un disco o hacer cosas de otra manera. Esto es principalmente un esfuerzo de administración de la dependencia y encapsulamiento ya que el mismo equipo de desarrolladores tendrá acceso para escribir extensiones y el sistema central.

¿Hay un patrón para esto? ¿Estoy en el camino correcto?

Respuesta

10

No necesita buscar nada exótico. Manejar este escenario es una característica fundamental de la arquitectura de seguridad de Java.

Cada clase tiene una "base de código", la ubicación desde la que se cargó. Entonces, si empaqueta cada extensión en un JAR por separado (o explota en un directorio separado), podrá adaptar los permisos otorgados a esa base de código.

En su caso, suena aún más simple. Si entiendo correctamente, todas las extensiones tendrán los mismos privilegios, que son menores que los de la aplicación principal. Por lo tanto, todos pueden compartir una base de código.

He aquí un ejemplo de un archivo de política:

grant codeBase "file:/path/to/app/lib/*" { 
    permission java.io.FilePermission "/path/to/app/-", "read"; 
    permission java.io.FilePermission "/path/to/app/data/-", "read,write,delete"; 
}; 

grant codeBase "file:/path/to/app/ext/*" { 
    permission java.util.PropertyPermission "java.io.tmpdir", "read"; 
    permission java.io.FilePermission "${java.io.tmpdir}/myapp/-", "read,write,delete"; 
}; 

Este sencillo ejemplo debería funcionar en any version of Java. Las versiones más recientes tienen extended policy syntax para otorgar permisos a un sujeto autenticado por JAAS.

2

No conozco los detalles de implementación, pero parece que lo que tiene en mente se acerca a lo que hace el servidor Apache Tomcat. Las webapps individuales en Tomcat se mantienen separadas con diferentes cargadores de clases individuales. Tal vez vale la pena echar un vistazo al código allí.

Cuestiones relacionadas