Мне нужно предоставить некоторые 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.
Поэтому мне интересно, нужно ли мне "регистрировать" эти объекты разрешений где-то или как-то?
Поэтому я закончил расширение классов 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
были сначала processPaths
из таблицы базы данных.