线程上的 Java 安全管理器

use*_*658 5 java security

我有一个使用各种第三方 API 的应用程序,其中一个第三方 API 在单独的线程中执行。

我希望一个特定线程可以访问特定目录并限制该线程访问我本地磁盘的其他目录。

这可以通过java安全管理器来实现吗?

alp*_*oop 5

如果我理解正确,听起来您想要做的是限制对您正在使用的第三方库之一的文件系统的访问。就 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
};
Run Code Online (Sandbox Code Playgroud)

可能需要反复试验才能发现您需要授予受限库哪些其他特定权限才能使其正确运行。

如果您的要求确实是限制对特定线程的访问,则需要编写自定义 SecurityManager 并覆盖 checkPermission 方法,以便它们检查哪个线程正在调用该方法以确定是否应授予权限。您需要向自定义 SecurityManager 添加方法以允许您的应用程序代码注册哪些线程应该受到限制,并且您需要确保这些附加方法不能被受限代码调用,例如通过创建和检查自定义权限。

编写自定义的 SecurityManagers 通常比使用标准的 SecurityManager 风险更大,所以如果你采用这种方法,你需要做一些仔细的测试。


Tom*_*ine 2

假设您想要信任的库编写良好,您可以在策略文件中设置每个库的权限,并java.security.AccessController.doPrivileged在线程内或围绕其构造添加调用。通常的免责声明是,编写得不好的受信任代码将允许不受信任的代码利用其信任。

自 1998 年发布 Java 2 以来,“自定义”安全管理器通常已经不再需要,但它似乎确实出现在很多人的记忆中。