Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SecurityManager多线程_Java_Multithreading_Security_Securitymanager - Fatal编程技术网

Java SecurityManager多线程

Java SecurityManager多线程,java,multithreading,security,securitymanager,Java,Multithreading,Security,Securitymanager,我一直在尝试使用自定义SecurityManager对一些外部加载的代码进行沙箱处理。我的安全经理工作得很好。我采取了与这里许多帖子建议的方法相同的方法:在执行潜在危险代码时设置自定义管理器,然后恢复到标准管理器。这很好,符合我的要求。但是,应用程序是多线程的:两个线程使用自定义管理器,一个使用默认管理器。这会导致受信任代码无法正常运行的情况,因为另一个线程刚刚设置了自定义安全管理器。有办法解决这个问题吗?或者,有没有更好的办法?我看到一些帖子谈论对同一个安全管理器使用不同的策略,但我找不到一个

我一直在尝试使用自定义SecurityManager对一些外部加载的代码进行沙箱处理。我的安全经理工作得很好。我采取了与这里许多帖子建议的方法相同的方法:在执行潜在危险代码时设置自定义管理器,然后恢复到标准管理器。这很好,符合我的要求。但是,应用程序是多线程的:两个线程使用自定义管理器,一个使用默认管理器。这会导致受信任代码无法正常运行的情况,因为另一个线程刚刚设置了自定义安全管理器。有办法解决这个问题吗?或者,有没有更好的办法?我看到一些帖子谈论对同一个安全管理器使用不同的策略,但我找不到一个很好的例子。非常感谢您的帮助。

您的安全管理器可以检查哪个线程正在运行。一个简单的本地线程可以做到这一点,但是,您可能需要一个InheritableThreadLocal,这样创建的任何其他线程都可以“继承”线程安全级别。

测试当前线程或删除安全限制不是一个好主意例如,假设不受信任的代码有一个喜欢睡觉的最终用户?

您对整个应用程序使用一个securitymanager。java安全框架就是为了处理这种情况而设计的。使事情正常运行的方法是使用策略文件的代码库功能,这使您能够为不同的代码库分配不同的权限。您可以分配您的“主”代码库“所有权限”,它将正常工作。您可以将任何导入的代码分配给受限代码库


这些都有大量的文档记录,可能与此问题最相关的部分是。

这是哪一个方面?是外部加载的代码需要(并被授予)更高的权限吗?外部加载的代码应该具有最低权限,主代码/主线程(加载外部代码)应该具有所有权限。据我所知,我们也有类似的问题,安全管理器对于整个VM是唯一和共享的,并且您不能同时拥有不同的安全管理器。你必须在同步块中运行线程代码的某些部分,或者类似的(丑陋的)好吧-我的建议将遵循下面Peter的建议。我采取了与许多帖子建议的相同的方法:在执行潜在危险的代码时设置自定义管理器,然后返回到标准管理器。啊,谁建议这么做的?您始终可以确定调用线程和调用AccessControlContext。。。这就是不应该这样做的方式(简而言之,设置/取消SM不是正确的方式),这似乎是“棘手”的。假设一个给定的线程可能会随着时间的推移在不同的上下文中运行,因此您需要在启动新线程时传播当前上下文(并且可能不会随着对旧线程的任何更改而将其更改回来)。此外,您还需要担心线程池或其他可以共享线程的地方。谢谢您的回答。我现在实现了类似的功能:主线程“注册”那些被认为不可信的线程(使用它们的id),SecurityManger中的checkPermission方法检查调用线程的id。但是,如果不受信任的代码创建子线程,这可能不起作用。目前,这是不允许的。但是如果需要,那么上述方法可能会失败。@coderino-我不知道您维护线程id的时间有多长,但是请注意,不能保证线程id在jvm的生命周期内是唯一的(如javadoc中所述)。使用
InheritableThreadLocal
解决了子线程和非唯一线程名称的问题。您可以调用所有线程“main”,并可以使用thread.setName()对其进行更改。@Peter Lawrey-ITL将适用于直接生成的线程,只要该值是不可变对象(因此更改父线程的值不会更改子线程的值)。它不能解决共享线程问题(例如线程池)。最终,我仍然认为最好使用设计好的java安全体系结构,大大降低“意外”特权泄漏的风险。(另外,唯一性问题是线程ID,而不是名称)。是否有关于这方面的好文档,包括示例?添加了到相关sun/oracle文档的链接。太好了,谢谢。我将仔细阅读这些参考资料,看看我能用些什么。