Политика безопасности Java не работает должным образом, всегда дают AccessControlException - PullRequest
0 голосов
/ 11 декабря 2018

Во-первых, у меня есть этот рабочий код:

import java.io.FileWriter;
import java.io.IOException;
public class TestPolicy {
    public static void main(String[] args) {
        FileWriter writer;
        try {
            writer = new FileWriter("testPolicy.txt");
            writer.write("hello1");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Он хорошо работает с

D:\Documents\myproject\mynet\mytest\java\security\target\classes>java -classpath . TestPolic

И сгенерирует новый файл с именем [testPolicy.txt]

Затем я добавил ../../src/myPolicy.txt с содержимым:

grant codeBase "file:D:\Documents\myproject\mynet\mytest\java\security\target\classes*" {
    permission java.io.FilePermission "testPolicy.txt", "read,write";
};

Я ожидал, пока я указал разрешение «чтение, запись», оно также должно работать хорошо,Но работает с исключением:

D:\Documents\myproject\mynet\mytest\java\security\target\classes>java -classpath . -Djava.security.manager -Djava.security.policy=../../src/myPolicy.txt TestPolicy
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "testPolicy.txt" "write")
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkWrite(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileWriter.<init>(Unknown Source)
        at TestPolicy.main(TestPolicy.java:8)

Где я ошибся, как это исправить?

Спасибо большое.

1 Ответ

0 голосов
/ 11 декабря 2018

Используйте прямые косые черты вместо обратных косых черт в URL-адресе codeBase в myPolicy.txt.Вам также может потребоваться косая черта между «классами» и «*».

Согласно документации PolicyFiles :

Примечание: значение codeBase являетсяURL и, следовательно, всегда должны использовать косые черты (никогда не ставить обратную косую черту) в качестве разделителя каталогов, даже когда исходный код кода фактически находится в системе Windows.Таким образом, если исходным местоположением для кода в системе Windows на самом деле является C: \ somepath \ api \, то запись codeBase политики должна выглядеть следующим образом:

grant codeBase "file:/C:/somepath/api/" {
    ...
};
...