2009-11-17 4 views
2

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

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

grant codebase " http://myIntranetServer/- " { permission java.security.AllPermission; };

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

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

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

Спасибо заранее,

MadeiraA

+0

Возможно, вам нужно подписать апплет для всех разрешений? (с самогенерированным сертификатом?) – rsp

+0

Я пробовал самоподписывание апплета, но ящик, который должен появиться для пользователя, чтобы позволить апплету запускаться под сертификатом, никогда не появляется. Я проверил файл jar, и в метаданных был сертификат RSA. Более того, солнце заявляет, что поле утверждения сертификата может не отображаться с самозаверяющими сертификатами. Из-за этого я изучаю изменение прав доступа к java.policy. – MadeiraA

ответ

4

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

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

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

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

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

Теперь, если вы читаете это LiveConnect Support in the New Java™ Plug-In Technology в разделе 2.8 Security Model of JavaScript-to-Java Calls ВС утверждает

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

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

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

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

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

Java Applet using 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/[USERNAME]/Примечание ведущий .)

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

Дрожание. После некоторого чтения ссылок, которые вы предоставили, я придумал использование AccessController.doPrivileged, чтобы освободить ограничение на доступ, наложенное стекем, и, наконец, работает! Еще раз спасибо за то, что вы указали все правильные указатели и взяли tinme, чтобы помочь. – MadeiraA

+0

Это интересно, поскольку это совсем не сработало для меня. Немного поиграли с AccessController и PrivilegedAction, но это не изменило для меня никакого поведения. Хорошо для вас. Поскольку это интрасеть, вам, возможно, повезло, что она будет работать и на всех ваших клиентов. – jitter

+0

Теперь рассмотрите вопрос о моих ответах и, возможно, даже примите его за все усилия и время, которое я положил в – jitter

0

пробовал себя в настоящее время.

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

Политика: .java.policy (находится в C:/Documents и Settings/[ USERNAME] /. Обратите внимание, ведущий .)

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

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

Затем использовали эти (перезагрузке файл политики в Java Console) апплет не удается отобразить [USERNAME]

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

Аппельт: 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 не работает и в то же время заявляет, что «предоставление разрешения по умолчанию ... работает»?

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

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

Да. Если у меня есть разрешение как grant { разрешение java.security.AllPermission; }; он отлично работает. Если я применяю кодовую базу, это не так. Я пробовал грубую силовую атаку проблемы, используя либо простое имя машины, и полное имя машины (тот, у кого есть домен), и различные комбинации случаев, потому что я прочитал в другом форуме, что codeBase обрабатывается case-sentive , Факт ничего не работает. – MadeiraA

+0

Я использую IE8 и Firefox. Файл политики является правильным, поскольку я могу изменить поведение, когда я его изменяю. как я уже сказал выше, я пытаюсь несколько вариантов для myIntranetServer: {servername, servername.domainname.pt} и некоторые комбинации тех же значений, изменяющих регистр букв. Спасибо за ваш интерес. – MadeiraA

+0

Единственная вещь, связанная с чувствительностью к регистру, известная мне, заключается в том, что codeBase должен быть написан всем нижним регистром execpt B. codeBase – jitter

 Смежные вопросы

  • Нет связанных вопросов^_^