Не удалось настроить AllPermission для апплета интрасети. Кто-нибудь может помочь? - PullRequest
2 голосов
/ 17 ноября 2009

После долгих чтений и тестирования я не смог дать все разрешения апплету интрасети с помощью опции предоставления кода codeBase. Этому апплету требуются полные разрешения, поскольку он должен иметь доступ к библиотекам драйверов для устройств чтения OCR (которые также записывают файлы изображений на жесткий диск) и других подобных внешних устройств.

Я настроил свой файл java.policy и добавил следующее:

grant codebase "<a href="http://myIntranetServer/-" rel="nofollow noreferrer">http://myIntranetServer/-</a>" { permission java.security.AllPermission; };

После перезагрузки файла политики в консоли и даже перезапуска браузера я получаю исключение java.security.AccessControlException: доступ запрещен для многих моих операций, включая чтение системного свойства user.name, которое не предоставляется по умолчанию.

Для отладки я также попытался дать разрешение all по умолчанию, и это работает, поэтому моя проблема в основном связана с опцией de codeBase. Я использую клиенты Windows 7 и Linux с JRE1.6-u17, и оба имеют одинаковое поведение.

Может кто-нибудь помочь?

Заранее спасибо,

MadeiraA

Ответы [ 2 ]

4 голосов
/ 24 ноября 2009

Я не уверен, правильно ли я понял ваш последний комментарий. Как вы говорите две (для меня) разные вещи:

  • Вы используете plugin.jar (что означает для меня ваши java-вызовы функций javascript)
  • " Я вызываю те же функции из Javascript " (что для меня означает, что ваш javascript вызывает функции Java)

Я полагаю, что последняя является правильной интерпретацией.

Если вы просто вызываете методы java (через liveconnect), которые ничего не делают для безопасности, все в порядке. И вы можете просто сделать (если апплет с id="myapplet") myapplet.safeMethod(); прямо в вашем коде JavaScript.

Основная проблема с вызовом java-методов, которые обычно делают что-то ограниченное для апплетов из javascript, заключается в том, что вызовы, похоже, выполняются в ином контексте в JVM, чем сам апплет. Таким образом, рассматриваются как непривилегированный код, и вы получаете AccessControlException. Хотя, например, Как и в моем другом ответе, методы, которые выполняются самим апплетом, получают необходимые разрешения и выполняются.

Теперь, если вы прочитаете это Поддержка LiveConnect в новой технологии подключаемых модулей Java ™ в разделе 2.8 Модель безопасности вызовов JavaScript-Java Состояния SUN

Когда вызов JavaScript-Java сделано, код JavaScript смоделирован как будто это исходит от ненадежный апплет, чей источник кода база документов (т. е. URL-адрес каталог, содержащий документ).

Я читаю это так: если апплет и javascript приходят с одного и того же сайта, то вызовы javascript-to-java должны выполняться с теми же разрешениями, что и сам апплет. Что в нашем случае означает, с какими правами мы устанавливаем наши grant.

Но это работает только в Опере для меня. FF и IE6 оба выбрасывают AccessControlException. Но это может сработать для вас во всех браузерах.

В следующем коде есть два метода userName2() и userName(). userName2() WFM во всех браузерах. userName() работает только в Опере. Проверьте, нажав кнопки на html-странице.

Как видите, userName2() не может использоваться таким образом для реального использования (может вызываться только один раз). Но вы можете найти решение, которое придумал кто-то другой, когда у вас возникла подобная проблема, и соответственно расширить userName2()

Java-апплет с использованием LiveConnect

Кроме того, вы можете подумать о том, что я не попробовал. Все вызовы из javascript-to-java ничего не делают с безопасностью, просто (при необходимости) передают данные и немедленно возвращаются. Затем апплет выполняет фактическую работу (как в ссылке, показанной выше). После этого апплет может запустить обратный вызов на html-страницу через JSObject ( plugin.jar )

TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.security.AccessControlException;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  String userName;
  Thread access = new Thread() {
    @Override
    public void run() {
      try {
        userName = System.getProperty("user.name");
      } catch (AccessControlException e) {
        userName = "Oops, failed in thread. No read permissions!";
      }
    }
  };
  public void init() {
    setLayout(new BorderLayout());
    add(BorderLayout.CENTER, output);
  }
  public String userName2() throws InterruptedException {
    access.start();
    access.join();
    output.setText(userName);
    return userName;
  }
  public String userName() {
    String userName = "Oops, failed in liveconnect-context. No read permissions!";
    try {
      userName = System.getProperty("user.name");
    } catch (AccessControlException e) {
      e.printStackTrace();
    }
    output.setText(userName);
    return userName;
  }
}

test.html

<html><head><title>test</title></head><body>
  <applet id="myapplet" code="TestApp" width="350px" height="80px"></applet><br>
  <input type="button" value="liveconnect version" onclick="javascript:alert(myapplet.userName());"><br>
  <input type="button" value="hacky thread version" onclick="javascript:alert(myapplet.userName2());">
</body></html>

Политика: .java.policy (создается вручную в C: / Documents and Settings / [ИМЯ ПОЛЬЗОВАТЕЛЯ] / Обратите внимание на начальную .)

grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};
0 голосов
/ 18 ноября 2009

Попробовал сам сейчас.

  • файлы классов + html-файл, расположенный на сервере http://[domain].xxx/~someusername/somefolder/
  • файлы классов + html-файл, расположенный в локальной файловой системе C:/Documents and Settings/[USERNAME]/Desktop/somefolder

Политика: .java.policy (находится в C: / Documents and Settings / [ИМЯ ПОЛЬЗОВАТЕЛЯ] /. Обратите внимание на ведущий .)

При использовании этих апплетов работает и отображает [USERNAME]

grant codeBase "file:///-" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/-" {
  permission java.util.PropertyPermission "user.name", "read";
};

Затем использованный апплет (перезагруженный файл политики в консоли java) не отображает [USERNAME]

grant codeBase "file:///c/*" {
  permission java.util.PropertyPermission "user.name", "read";
};
grant codeBase "http://[domain].xxx/*" {
  permission java.util.PropertyPermission "user.name", "read";
};

Appelt: TestApp.java

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.security.*;

public class TestApp extends Applet {
  Label output = new Label("What is the value of user.name?");
  public void init() {
    Button button = new Button("Click me!");
    setLayout(new BorderLayout());
    add(BorderLayout.NORTH, button);
    add(BorderLayout.CENTER, output);
    button.addActionListener(
      new ActionListener() {
        @Override
        public void actionPerformed( ActionEvent ev ) {
          try {
            output.setText(System.getProperty("user.name"));
          } catch (AccessControlException e) {
            output.setText("Oops, failed. No read permissions");
          }
        }
      }
    );
  }
}

HTML: index.html

<html><body>
  <applet code="TestApp.class" width=350 height=80></applet>
</body></html>

Я сейчас немного сбит с толку. Вы утверждаете, что вышеприведенный оператор grant не работает, и в то же время утверждаете, что "предоставление разрешения all по умолчанию ... работает"?

Несколько вопросов

  • Какой браузер вы используете?
  • Какой файл java.policy вы редактировали / Где вы его разместили
  • Как действительно выглядит URL? Является ли myIntranetServer чем-то, что может быть разрешено через DNS? Если нет, то, возможно, у java возникли проблемы с применением правила
...