Страницы

Поиск по вопросам

вторник, 23 апреля 2019 г.

В чем смысл класса Permission в java

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); } }
Подробнее смотрите в официальной документации

Комментариев нет:

Отправить комментарий