2009-04-08 15 views
5

Je suis en train de développer un système qui permet aux développeurs de télécharger des scripts groovy personnalisés et des modèles de freemarker. Je peux fournir un certain niveau de sécurité à un très haut niveau avec l'infrastructure de sécurité Java par défaut - c'est-à-dire empêcher le code d'accéder au système de fichiers ou au réseau, mais j'ai besoin de restreindre l'accès à certaines méthodes. Mon plan était de modifier les runtimes Groovy et Freemarker pour lire les annotations qui seraient soit en liste blanche ou noire de certaines méthodes, mais cela me forcerait à maintenir une version bifurquée de leur code, ce qui n'est pas souhaitable.Sandboxing Code Java/Groovy/Freemarker - Empêcher l'exécution de méthodes spécifiques

Tout ce que je dois essentiellement faire est d'empêcher l'exécution de méthodes spécifiques quand on les appelle depuis Groovy ou Freemarker. J'ai considéré un hack qui regarderait la pile d'appels, mais ce serait un énorme coup de vitesse (et c'est assez compliqué).

Est-ce que quelqu'un a d'autres idées pour implémenter cela?

Répondre

5

Vous pouvez le faire en sous-classant le GroovyClassLoader et en appliquant vos contraintes dans un AST Visiteur. Ce message explique comment le faire: http://hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html

De plus, le code référencé se trouve dans le dossier samples du programme d'installation de Groovy 1.6.

+1

Dans la plupart des cas, la classe sur laquelle la méthode est activée ne sera pas connue au moment de la compilation, donc l'analyse de l'AST ne fonctionnera pas vraiment. Pourtant, c'est la meilleure réponse ici, donc je vais cocher celui-ci. J'ai fini de trouver une solution décente en utilisant Metaclasses. –

2

OSGi est idéal pour cela. Vous pouvez partitionner votre code en bundles et définir exactement ce que chaque bundle expose, et à quels autres bundles. Cela marcherait-il pour toi?

+0

Est-ce que cela me permet de restreindre le code d'appeler des méthodes spécifiques? –

+0

Le concept est quelque chose comme le regroupement. Vous pouvez ensuite restreindre les méthodes et les éléments en dehors de ce groupe. –

+0

Strictement parlant, vous ne pouvez pas empêcher certaines méthodes d'une classe d'être appelées, mais vous pouvez créer une classe de base et une classe enfant avec plus de méthodes, et ne donner accès qu'à la classe de base plus restrictive. –

3

Vous devriez jeter un oeil au projet groovy-sandbox de kohsuke. Jetez aussi un coup d'œil à son blog post here sur ce sujet et à ce que la solution traite: sandboxing, mais inconvénient de performance.