Java Applet - XML - SecurityException

flashray

Erfahrenes Mitglied
Hallo,

habe ein Gästebuch als Applet geschrieben. Die Einträge werden in eine XML Datei gespeichert und gelesen. Im Appletviewer von Eclipse funktioniert es. Wenn ich die Daten hochlade leider nicht mehr, es wird eine java.security.AccessControlException ausgelöst.

Da sich das Applet und die XML-Datei auf dem gleichen Server befinden müsste es doch eigentlich keine Probleme geben!?
Oder muss ich beim schreiben und lesen Passwort und Benutzernamen meiner Domain mitangeben? Wenn ja, mit welchen Klassen und oder Paketen vom Java-SDK mache ich das?

Danke.

Vg Erdal
 
Hallo Stefan,

wie muss ich die Rechte für die Dateien setzen.

- eine HTML-Datei in der sich das Applet befindet
- 9 class Dateien
- dom4j-1.5.2.jar
- und eine XML-Datei

für

1. Eigentümer
2. Gruppe
3. Andere

für write, read, execute

Bin mit chmod nicht so sehr vertraut und weiss jetzt nicht welche der obigen insgesamt 12 Dateien ich wie setzen soll.

Das ist die Fehlermeldung aus der Sun Java Konsole vom IE wenn ich das Applet ausführe.
--------------------------------------------------------------------
java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
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.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at java.io.Win32FileSystem.getUserPath(Unknown Source)
at java.io.Win32FileSystem.resolve(Unknown Source)
at java.io.File.getAbsolutePath(Unknown Source)
at java.io.File.toURL(Unknown Source)
at GuestXML.read(GuestXML.java:196)
at GuestXML.start(GuestXML.java:185)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception in thread "thread applet-GuestXML.class" java.lang.NullPointerException
at sun.plugin.util.GrayBoxPainter.showLoadingError(Unknown Source)
at sun.plugin.AppletViewer.showAppletException(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
-----------------------------------------------------------------

Vg Erdal
 
Hallo Tom,

wieso muss ich das Applet signieren? Sowohl das Applet als auch die XML-Datei sind auf dem gleichen Server. Das müsste doch ausreichen?
Ich habe nun auch per chmod sämtliche Rechte allen beteiligten Dateien zugewiesen. Es funktioniert leider trotzdem nicht.

Vg Erdal
 
Hallo!

java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
Die Fehlermeldung weist jedoch darauf hin, dass du in deinem Applet auf das System-Property user.dir des Clients zugreifst... und dass darfst du ohne entsprechende Permission durch signieren oder policy file nicht. ;)

Gruss Tom
 
Das Problem ist jetzt teilweise gelöst. Das Applet kann jetzt das xmlfile lesen. Bisher hatte ich die Datei mit File angesprochen, welches eine security Exception ausgelöst hatte. Wenn ich die URL mit Hilfe von getcodebase() erstelle wird keine Exception ausgelöst.
Das schreiben mit XMLWriter und FileWriter klappt noch nicht.

Vg Erdal
 
Hallo,

ich benutze dom4j zum bearbeiten von xml-Dateien. Das Lesen funktioniert. Beim Schreiben bekomme ich allerdings eine Security - Exception. Kennt jemand vielleicht eine Alternative für diese Zeile. Ich glaube das der FileWriter die Exception auslöst. Hab aber keine Idee was ich stattdessen verwenden soll.

XMLWriter writer = new XMLWriter(new FileWriter(filename), format);

Wenn ich beim lesen bzw. parsen die URL mit Hilfe der Klasse File erstelle und dem reader übergebe wird auch eine Exception ausgelöst. Dies habe ich umgangen indem ich getcodebase() zum erstellen der URL verwendet habe. Da der XMLWriter einen Writer als parameter verlangt, hilft mir getcodebase() diesmal nicht.

Code:
public class Xmlexample () {

  ...

  String filename = "entries.xml"
  URL u;

  public Document read () {

  ...

  u1  = new URL(getCodeBase(), filename);
  SAXReader reader = new SAXReader();
  Document document = reader.read(url);
  return document;
  }

  public void write(Document doc) {

  ...

    try {
      OutputFormat format = OutputFormat.createPrettyPrint();
      XMLWriter writer = new XMLWriter(new FileWriter(filename), format);
      writer.write(doc);
      writer.close();

        } catch (IOException e) {}
  }

}

Vg Erdal
 
So sieht aktuell die Fehlermeldung aus. Der auslöser scheint FileWriter zu sein. Der Rest sind Folge-Exceptions. Die Security dürfte eigentlich nicht meckern da das Applet und die zu bearbeitende xml-Datei auf dem gleichen Server liegt.

Exception in thread "AWT-EventQueue-3" java.security.AccessControlException: access denied (java.io.FilePermission entries.xml 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 Xml.write(Xml.java:111)
at GuestXML.write(GuestXML.java:227)
at GuestXML$3.actionPerformed(GuestXML.java:172)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Hallo!

Wenn du ein File mit dem "relativen" Namen/Path String filename = "entries.xml"; auf dem Client erzeugst wird beim Schreiben auch versucht das File lokal auf dem CLIENT anzulegen... willst du das? Wenn du relative Dateiennamen angibst, werden diese bei standardmaessig (IMHO) immer relativ zum HOME Directory des aktuellen users betrachtet. Wie ich schon sagte, du musst das Applet entweder entsprechend signieren oder die Policy files entsprechend anpassen.

Gruss Tom
 
Zurück