Ограничение доступа к файлам в Java

проблема:
В моем Java-приложении (не апплете) я хочу ограничить определенные операции с файлами всеми классами, кроме списка/группы/пакета классов, которые не должны быть ограничены.

в частности, я хотел бы ограничить...

    читает пишет
  • создание файла
  • удаление файла

...таким образом, они могут быть выполнены только в текущем рабочем каталоге для всех но неограниченные классы.

попытка SecurityManager:
Я попытался реализовать подкласс класса SecurityManager, который реализует это поведение, однако кажется, что при проверке предоставленная информация не дает больше, чем просто имя файла (если я чего-то не хватает?).

кроме того, я не совсем понимаю, как в этом случае я мог бы узнать класс, из которого выполняется вызов, чтобы разрешить мне нужно определить, разрешать ли операцию или вызывать исключение. Есть ли способ получить всю информацию, необходимую для работы этого подхода?

попытка на основе политики:
Я также знаю, что политики Java предназначены для ограничения действий классов, включая такие вещи, как файловые операции. Тем не менее, я действительно изо всех сил пытался найти хороший ресурс, чтобы узнать, как я могу решить свои проблемы с помощью .политика файл.

подведение итогов вопроса:

1) есть ли какие-либо альтернативные подходы, которые могут быть предпочтительнее тех, о которых я упомянул?

2) возможно ли это с помощью SecurityManager? Я упускаю из виду, как я должен на самом деле реализовать такой подход?

3) возможно ли это с помощью файла политики? Есть ли хорошие ресурсы, которые я пропустил на этом спереди?

я действительно не рекламирую какую - либо тяжелую работу, которую мне нужно инвестировать в достижение этого-я просто не уверен, как я должен подойти к ней должным образом. Мне также катастрофически не хватает хороших ресурсов, чтобы научить меня двум возможным подходам, о которых я упоминал, чтобы позволить мне реализовать их самостоятельно. Прежде всего, я не боюсь значительного чтения там, где это необходимо!

спасибо за любую помощь вы можете дать, заранее.

1 ответов


вот как вы можете сделать это с помощью файла политики.

создайте файл 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]);
    }
}

создать образец.файл политики:

/* 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