public class Worker {
private static String path;
public static void main(String[] argv) throws Exception {
path = "C:\\glassfish-4.1.1\\glassfish4\\README.txt";
Permission permission = new FilePermission(path, "read");
try {
AccessController.checkPermission(permission);
}catch (Exception e){
System.out.printf(String.valueOf(e));
}
System.out.println(new FileInputStream(new File(path)).read());
}
}
Этот класс вернет что-то похожее на
java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\glassfish-4.1.1\glassfish4\README.txt" "read")84
Почему удалось прочитать из файла, когда прав на это нет!?
Ответ
Для ограничения доступа к файлам в файловой системе используются методы класса File
setExecutable()
setReadable()
setWritable()
Пример, который приводите вы, относится к настройке SecurityManager. Это механизм который позволяет ограничивать Java приложению доступ к определенным ресурсам (не только файлам). В качестве примера, возьмем апплеты - SecurityManager не дает им доступа к файловой системе.
Почувствуйте разницу - SecurityManager не модифицирует права файла в файловой системе, а запрещает Java приложению совершать с ним определенные действия. В этом и смысл класса Permission, и наследуемых от него классов - они описывают эти действия.
Файл у вас прочитался потому что в JDK, по умолчанию, SecurityManager отключен. Проверить это можно таким образом:
System.out.println(System.getSecurityManager()); // null, если отключен
Запустите приложение с ключом VM -Djava.security.manager и файл у вас прочитать не получится, до тех пор пока не будет настроена соответствующая security policy. Дефолтные лежат в $JAVA_HOME/lib/security
public static void main(String[] args) throws FileNotFoundException, IOException {
System.out.println(System.getSecurityManager());
String path = "D:/test/file.txt";
check(path, "read,write");
System.out.println(new FileInputStream(new File(path)).read());
}
static void check(String path, String actions) {
FilePermission perm = new FilePermission(path, actions);
try {
AccessController.checkPermission(perm);
} catch (Exception e) {
System.out.println(e);
}
}
Подробнее смотрите в официальной документации
Комментариев нет:
Отправить комментарий