如果我理解正确,这听起来像您要限制正在使用的第三方库之一对文件系统的访问.就Java SecurityManager而言,此特定的第三方库在单独的线程中运行这一事实无关紧要:Java安全策略根据加载代码的位置,是否经过签名或所使用的用户来授予权限.运行代码,但不是基于代码在哪个线程中运行.
为了将特定库的访问限制在文件系统的某些区域,您需要一个策略文件,该策略文件为所有其他代码授予必要的权限,并为要限制的库提供有限的权限.假设您正在运行的代码位于一组单独的jar文件中,并且您不想对任何其他代码施加任何限制,则策略文件将如下所示:
grant codebase "file:/path/to/your-application.jar" {
permission java.security.AllPermission;
};
grant codebase "file:/path/to/trusted-library.jar" {
permission java.security.AllPermission;
};
grant codebase "file:/path/to/another-trusted-library.jar" {
permission java.security.AllPermission;
};
grant codebase "file:/path/to/restricted-library.jar" {
permission java.io.FilePermission "/path/to/particular/directory", "read,write";
// Any additional permissions this library needs
};
可能需要经过反复试验才能发现您需要向受限库授予哪些其他特定权限才能使其正常运行.
如果您的要求确实是限制对特定线程的访问,则需要编写一个自定义SecurityManager并重写checkPermission方法,以便它们检查哪个线程正在调用该方法,以确定是否应授予该权限.您需要将方法添加到自定义SecurityManager中,以允许您的应用程序代码注册应限制哪些线程,并且需要确保受限制的代码无法调用这些其他方法,例如,通过创建和检查自定义权限.
编写自定义SecurityManager的风险通常比使用标准SecurityManager的风险大,因此,如果采用这种方法,则需要进行一些仔细的测试.