问题:
在我的Java应用程序(不是applet)中,我希望将某些文件操作限制到所有类,但不应限制的类列表/组/包除外。
具体地说,我想限制...
...such指出,除了不受限制的类之外,它们只能在当前工作目录中完成。
SecurityManager尝试:
我曾尝试实现实现此行为的SecurityManager类的一个子类,然而,当进行检查时,似乎提供的文件信息不只是文件名(除非我遗漏了什么?)。
此外,我也不太明白在这种情况下,我如何才能找到发出调用的类,以便确定是允许操作还是抛出异常。有没有办法让我获得这种方法工作所需的所有信息?
基于策略的尝试:
我还意识到Java策略旨在限制类的操作,包括文件操作。然而,我真的很难找到一个好的资源来学习如何使用.policy文件来解决我的问题。
问题的摘要:
1)有没有比我前面提到的方法更可取的替代方法?
2)使用SecurityManager是否可行?我是不是错过了我应该如何实现这样的方法?
3)是否可以使用策略文件?在这方面我错过了什么好的资源吗?
我真的不知道我需要投入多少努力才能实现这个目标--我只是不确定我应该如何正确地处理它。我也严重缺乏好的资源来教我关于我提到的两种可能的方法,让我自己实现它。最重要的是,我并不害怕在需要的地方进行重要的阅读!
提前感谢给你的任何帮助。
发布于 2011-04-03 09:26:50
以下是如何使用策略文件执行此操作。
创建可使用权限执行操作的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<Reader>() {
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 "<<ALL FILES>>", "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
https://stackoverflow.com/questions/5526008
复制相似问题