2009-12-12 105 views
2

假设我正在编写一些执行客户端代码(Java)的环境。客户向jar发送清单信息。环境从jar中创建一些类实例(假设Runnable的实例)并在某个线程中运行它。但我需要保证客户端代码不会启动自己的线程或创建自己的ExecutorService等等。线程安全策略

安全经理有没有可能做到这一级别的限制?如果是这样,我该如何做到这一点?

回答

2

我能想到的最好方法是使用AspectJ做一些运行时编织,如果有其他线程/ runnables创建,那么要么抛出错误或以某种方式通知用户他们有问题。

然后你就可以实现各种安全协议,例如,你可能不仅防止线程,但任何系统调用,例如,就像你可能会禁止动态查询,只是允许预处理语句。

否则,您可能需要使用反射器API来执行此类型的实现。

+0

这似乎很有趣的想法。我会尽力去解决它。 – 2009-12-12 05:51:06

0

我认为你需要扩展SecurityManager并使用你自己的实现。

此论坛:http://forums.sun.com/thread.jspa?threadID=761922谈论如何重写SecurityManager.checkAccess(ThreadGroup)以防止创建线程,但听起来好像没有特定的“创建线程y/n”权限。

+0

默认情况下,当在允许组中创建线程时,安全管理器不检查权限。可能是由于向后兼容性。请注意,您始终可以在某些线程上运行代码,例如终结线程。 – 2009-12-12 05:15:40

+0

当然,它不会默认检查,因此您需要设置您自己的SecurityManager。 Thread构造函数调用ThreadGroup.checkAccess()方法,该方法调用安全管理器来测试MODIFY_THREADGROUP_PERMISSION。 – Ash 2009-12-12 08:03:52