我需要将一些java.io.FilePermissions授予几个目录。这些目录是从数据库表中获取的,所以我真的不想在策略文件中设置这些特定权限。
我的应用程序中有以下代码:
FilePermission permission1 = new FilePermission(inputDir+File.separatorChar+"*", "read, write");
FilePermission permission2 = new FilePermission(processDir+File.separatorChar+"*", "read, write");
但是当我的应用程序尝试将文件从inputDir
移动到processDir
时,我继续得到java.security.AccessControlException。
所以我想知道我是否必须注册"这些权限对象在某处或某种程度上?
答案 0 :(得分:1)
所以我最终扩展了Policy
和PermissionCollection
课程,在我的课程开始时,我打电话给Policy.setPolicy()
。从本质上讲,这为您提供了一种设置某些策略的编码方式。我不知道它是否有用,但它对我有用,因为我想将java.io.FilePermission
授予可能随时间变化的特定目录。
无论如何,这里有一些代码来演示我做了什么:
public class AwesomePolicy extends Policy {
private PermissionCollection myPermissions;
private List<Path> inputPaths;
private List<Path> processPaths;
public AwesomePolicy(List<Path> inputPaths, List<Path> processPaths){
this.inputPaths=inputPaths; // shallow copy
this.processPaths=processPaths; // shallow copy
myPermissions = new AwesomePermissionCollection();
populateAwesomePermissionCollection();
}
@Override
public PermissionCollection getPermissions(CodeSource codesource){
return permissions;
}
private void populateAwesomePermissionCollection(){
for(Path p : inputPaths){
myPermissions.add(new FilePermission(p.toString() + File.separatorChar + "*", "read, write");
for(Path p: processPaths){
myPermissions.add(new FilePermission(p.toString() + File.separatorChar + "*", "read, write");
}
}
}
public AwesomePermissionCollection extends PermissionCollection{
private static final long serialVersionUID = -7456927975079431927L;
List<Permission> myPermissions = new ArrayList<Permission>();
@Override
public void add(Permission p){
myPermissions.add(p);
}
@Override
public Enumeration<Permission> elements(){
return Collections.enumeration(myPermissions);
}
@Override
public boolean implies(Permission permission){
for(Permission p: myPermissions){
if(p.implies(permission)){
return true;
}
}
return false;
}
}
然后在我的主程序中我刚刚执行Policy.setPolicy(new AwesomePolicy(inputPaths, processPaths));
,其中inputPaths
和processPaths
首先从数据库表中获取。