限制Java中的文件访问

问题:
在我的Java应用程序(不是applet)中,我希望将某些文件操作限制为除了不应限制的类的列表/组/包之外的所有类。

具体来说,我想限制……

  • 文件读取
  • 文件写入
  • 文件创建
  • 文件删除

…这样它们只能在当前工作目录中为除了不受限制的类之外的所有类完成。

SecurityManager尝试:
我试图实现SecurityManager类的子类来实现这种行为,但是当检查时,提供的文件信息似乎不仅仅提供文件名(除非我遗漏了什么?)。

另外,我不太明白在这种情况下我怎么能找到调用的类,允许我确定是允许操作还是抛出exception。 有什么办法可以获得这种方法所需的所有信息吗?

基于政策的尝试:
我也知道Java策略旨在限制类的操作,包括文件操作等。 但是,我真的很难找到一个很好的资源来学习如何使用.policy文件来解决我的问题。

问题总结:

1)是否有任何替代方法可能比我提到的方法更好?

2)使用SecurityManager可以实现吗? 我错过了我应该如何实际采用这种方法吗?

3)这可以使用策略文件吗? 我在这方面错过了什么好资源吗?

我真的不喜欢为实现这一点而需要投入的任何努力工作 – 我只是不确定我应该如何正确地处理它。 我也非常缺乏足够的资源来教我足够的关于我提到的两种可能的方法,允许我自己实现它。 最重要的是,我并不害怕需要的重要阅读!

感谢您提前给予的任何帮助。

以下是使用策略文件执行此操作的方法。

创建可以使用特权执行的Java文件:

package egPriv; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; public class PrivCat { /** Cat a file with no privileges */ public void cat(String file) throws IOException { cat(new FileReader(file)); } private void cat(Reader r) throws IOException { int c; while( (c = r.read()) != -1 ) { System.out.print((char) c); } r.close(); } /** Cat a file WITH privileges */ public void catPriv(final String file) throws IOException { Reader r; try { r = AccessController.doPrivileged(new PrivilegedExceptionAction() { public Reader run() throws IOException { return new FileReader(file); } }); } catch (PrivilegedActionException e) { throw (IOException) e.getCause(); } cat(r); } } 

创建一个用于演示的常规文件

 package eg; import egPriv.PrivCat; import java.io.IOException; public class Cat extends PrivCat { public static void main(String[] args) throws IOException { Cat eg2 = new Cat(); System.out.println("Processing with privilege:"); eg2.catPriv(args[0]); System.out.println("Processing normally"); eg2.cat(args[0]); } } 

创建sample.policy文件:

 /* anyone can read write and execute within current working dir */ grant { permission java.io.FilePermission "${user.dir}", "read,write,execute"; }; grant { permission java.io.FilePermission "${user.dir}/*", "read,write,execute,delete"; }; /* Only code from this jar can work outside of CWD */ grant codebase "file:egPriv.jar" { permission java.io.FilePermission "<>", "read,write,execute,delete"; }; 

编译然后测试:

 jar cvf egPriv.jar egPriv jar cvf eg.jar eg echo 'Restricted' > ..\file.txt java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy eg.Cat ..\file.txt echo 'Open' > file.txt java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy eg.Cat file.txt