2013-12-09 79 views
2

我有一个应用程序使用各种第三方API的第三方API之一在单独的线程中执行。线程上的Java安全管理器

我想要一个特定的线程访问特定的目录并限制该线程访问本地磁盘的其他目录。

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

回答

1

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

自1998年发布Java 2以来,“自定义”安全管理器通常是不必要的,但它似乎出现在许多民间内存中。

2

如果我理解正确,这听起来像你想要做的是限制访问您正在使用的第三方库之一的文件系统。就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添加方法以允许您的应用程序代码注册哪些线程应该被限制,并且您需要确保这些附加方法不能被限制代码调用,例如创建并检查自定义权限。

编写自定义SecurityManagers通常比使用标准SecurityManager更具风险,因此如果采用此方法,您需要进行一些仔细的测试。