Ошибка: java.security.AccessControlException: доступ запрещен

Мне нужно подключиться к URL-адресу https с именем пользователя и паролем, чтобы прочитать файл. Я не могу подключиться к серверу (см. журнал ошибок ниже). У меня нет большого опыта работы с Java, поэтому мне нужна помощь с этим кодом.

import lotus.domino.*;
import java.net.*;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;

public class JavaAgent extends AgentBase {

public void NotesMain() {

  try {
    String username = "123";
    String password = "456";
    String input = username + ":" + password;
    String encoding = new sun.misc.BASE64Encoder().encode (input.getBytes());

    //Open the URL and read the text into a Buffer
    String urlName = "https://server.org/Export.mvc/GetMeetings?modifiedSince=4/9/2010";
    URL url = new URL(urlName);
    HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();

    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Content-Length", String.valueOf (encoding.length())); 
    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setAllowUserInteraction(true);
    connection.setRequestProperty("Authorization", "Basic " + encoding);
    connection.setRequestProperty("Cookie", "LocationCode=Geneva");

    connection.connect();

    BufferedReader rd = null;
      try{
        rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      } catch (IOException e) {
        System.out.println("Read failed");
        System.exit(-1);
      }

    String line;
    while((line = rd.readLine()) != null) {
      System.out.println(line.toString());
    }
    rd.close();

    connection.disconnect();

  } catch(Exception e) {
    e.printStackTrace();
  }
}
}

Выброшено исключение:

java.security.AccessControlException: Access denied (java.lang.RuntimePermission exitVM.-1)
 at java.security.AccessController.checkPermission(AccessController.java:108)
 at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
 at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.java:1449)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkRuntimePermission(AppletSecurity.java:1311)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1611)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
 at java.lang.SecurityManager.checkExit(SecurityManager.java:744)
 at java.lang.Runtime.exit(Runtime.java:99)
 at java.lang.System.exit(System.java:275)
 at JavaAgent.NotesMain(Unknown Source)
 at lotus.domino.AgentBase.runNotes(Unknown Source)
 at lotus.domino.NotesThread.run(Unknown Source)

person RMD    schedule 14.04.2010    source источник


Ответы (4)


Старая ветка, но я наткнулся на нее, поэтому вот обновленный ответ.

Ответ находится в вашей трассировке стека. хотя это может быть связано с использованием Domino, это общая проблема, которая может возникнуть для довольно простого апплета, используемого на обычной JVM, вызываемой из стандартных подключаемых модулей браузера Java, и, очевидно, ваш Java-агент использует песочницу апплета.

Апплетам не разрешается (за исключением прямого изменения политики безопасности Java на клиентском компьютере) выполнять некоторые критические вызовы. Даже при использовании подписанных апплетов.

В вашем случае System.exit(-1) вызывает исключение. Причина этого в том, что апплеты имеют довольно сложный жизненный цикл, и вы не должны возиться с ним. Это для вашего же блага, так как вы хотите, чтобы браузер мог взаимодействовать с апплетом для вас и иметь возможность разорвать (или повторно использовать) процесс JVM, запущенный для запуска апплета. Вызывая System.exit() или другие, вы испортили бы этот жизненный цикл и шансы вашего браузера контролировать уничтожение апплета.

Возможно, вы захотите еще раз подумать, зачем вам это нужно, поскольку вам, вероятно, не нужно вызывать здесь вызов System.exit().

person haylem    schedule 05.11.2012

Я так понимаю, это агент Java? Что нужно проверить.

  1. В свойствах агента установлен уровень безопасности для того, что вы хотите сделать. Обычно для доступа к файлам требуется как минимум уровень 2.

  2. Подпись агента или пользователя, для запуска которого разрешено выполнение агента на сервере.

  3. Вы можете изменить файл java.policy, чтобы разрешить доступ к определенным ограниченным классам. (но вы должны знать, почему вы вносите изменения).

http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html

person Sio    schedule 16.04.2010
comment
Я установил уровень безопасности в агенте на 3, и теперь я получаю это исключение: Вызвано: java.security.KeyStoreException: IBMKeyManager: проблема с доступом к хранилищу ключей java.security.cert.CertificateParsingException: java.io.IOException: ключ субъекта, java.security.spec.InvalidKeySpecException: Неизвестная спецификация ключа. на com.ibm.jsse2.ic.a(ic.java:16) на com.ibm.jsse2.kc.g(kc.java:4) на com.ibm.jsse2.kc.‹init›(kc.java :19) в java.lang.J9VMInternals.newInstanceImpl(собственный метод) в java.lang.Class.newInstance(Class.java:1325) в java.security.Provider$Service.newInstance(Provider.java:880) - person RMD; 16.04.2010
comment
Это похоже на новую проблему. Может быть, конфигурация хранилища ключей? Это не та область, с которой я играл. :/ - person Sio; 19.04.2010

Апплет может получить доступ только к тому серверу, с которого он загружен. Скорее всего, ваш апплет не загружается с сервера, к которому вы пытаетесь подключиться?

РЕДАКТИРОВАТЬ: Ваша трассировка стека предполагает, что установлен специализированный менеджер безопасности (COM.ibm.JEmpower.applet.AppletSecurity). Поиск в Google этого класса выявил проблему: http://lekkimworld.com/2006/02/28/imported_java_agent.html

person Arne Deutsch    schedule 14.04.2010
comment
Domino использует этот менеджер безопасности для реализации своей собственной детализированной модели безопасности с помощью агентов Java. Похоже, как намекает Сио ниже, что агент не работает с соответствующими разрешениями. Например, код Java, который обращается к удаленному ресурсу, требует ограниченных прав в мире Domino. - person Ben; 16.04.2010

Этот поток поддержки от IBM звучит похоже на ваша проблема, если вы работаете на сервере Domino 8.5.

person angryITguy    schedule 19.04.2010