Что делать с объектом Permission после его создания

1

Мне нужно предоставить некоторые 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.

Поэтому мне интересно, нужно ли мне "регистрировать" эти объекты разрешений где-то или как-то?

Теги:
file-permissions
file-io

1 ответ

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 были сначала processPaths из таблицы базы данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню