# RMI Fehler: access denied



## heidiweber (2. Jun 2007)

Hallo, 

ich habe folgendes Problem bei meinem RMI-Projekt: 


Der Server und der Client sind in Eclipse als eigenständige Projekte 
angelegt. 
Solange sich die beiden Main-Klassen (vom Server und vom Client) - in 
ihrem eigenen Projekt(-Ordner) -im selben Package(-Namen) befinden, 
funktioniert mein RMI-Projekt. 


Wenn ich aber ein Package umbenenne, kommt folgende Fehlermeldung: 



```
Client exception: java.rmi.UnmarshalException: error unmarshalling 
return; neste 
d exception is: 
        java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no security 
 manager: RMI class loader disabled) 
java.rmi.UnmarshalException: error unmarshalling return; nested 
exception is: 
        java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no security 
 manager: RMI class loader disabled) 
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
        at example.hello1.Client.main(Client.java:21) 
Caused by: java.lang.ClassNotFoundException: example.hello.RemoteLogin 
(no secur 
ity manager: RMI class loader disabled) 
        at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source) 
        at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown 
Source) 
        at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown 
Source) 
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown 
Source) 
        at java.io.ObjectInputStream.readProxyDesc(Unknown Source) 
        at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown 
Source) 
        at java.io.ObjectInputStream.readObject0(Unknown Source) 
        at java.io.ObjectInputStream.readObject(Unknown Source) 
        ... 2 more
```

Die Fehlermeldung bedeutet doch, dass kein securitymanager vorhanden 
ist. 


Somit habe ich im Ordner vom Client als auch beim Server die folgende 
Datei (client.policy) - direkt auf oberster Ebene im jeweiligen 
Projektordner - angelegt: 


```
grant { 
permission java.net.SocketPermission "192.168.0.2:1099", "connect, 
accept, resolve"; 
permission java.security.AllPermission "", ""; 
};
```

Um die Datei den SecurityManager zu starten, habe ich dann noch 
fogendes ganz am Anfang der Main-Methoden vom Server und vom Client 
eingebaut: 


```
System.setProperty("java.security.policy", "client.policy"); 
if (System.getSecurityManager() == null) 
System.setSecurityManager(new RMISecurityManager());
```

Ich habe auch gelesen, dass man diese Datei per VM-Argument übergeben 
kann. Dies habe ich aber nicht gemacht, da ich denke, dass dieser 
Aufruf korrekt ist? Oder liege ich da falsch? 


Auf jedenfall bekomme ich jetzt diese Fehlermeldung: 


```
Client exception: java.security.AccessControlException: access denied 
(java.net. 
SocketPermission 192.168.0.2:1099 connect,resolve) 
java.security.AccessControlException: access denied 
(java.net.SocketPermission 1 
92.168.0.2:1099 connect,resolve) 
        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.checkConnect(Unknown Source) 
        at java.net.Socket.connect(Unknown Source) 
        at java.net.Socket.connect(Unknown Source) 
        at java.net.Socket.<init>(Unknown Source) 
        at java.net.Socket.<init>(Unknown Source) 
        at 
sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S 
ource) 
        at 
sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S 
ource) 
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) 
        at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown 
Source) 
        at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown 
Source) 
        at sun.rmi.server.UnicastRef.newCall(Unknown Source) 
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
        at example.hello1.Client.main(Client.java:26)
```

Aber ich erlaube doch in der Policy-Datei alles. Oder kann der diese 
Datei nicht finden (wie kann man das prüfen)? Oder deutet diese 
Fehlermeldung auf was anderes hin? 


Vielen lieben Dank 
Heidi


----------



## HoaX (2. Jun 2007)

nein, ganz oben steht:

```
Client exception: java.rmi.UnmarshalException: error unmarshalling
```
er kann ein objekt nicht wieder aus dem stream herstellen - warum?

darum:

```
return; neste
d exception is:
        java.lang.ClassNotFoundException: example.hello.RemoteLogin
```
er findet die klasse example.hello.RemoteLogin nicht


----------



## heidiweber (2. Jun 2007)

Hallo HoaX,

und was heisst das jetzt? 

Die Fehlermeldung tritt am Client auf. Das Package, das da angegeben ist, ist das Interface vom Server, das ich an die Registry binde. Muss ich das im Projekt vom Client einbinden (Glaube ich aber nicht)? 

Oder was muss ich machen?
Vielen Dank
cu
Heidi


----------



## HoaX (2. Jun 2007)

du bekommt vom server ein objekt vom typ example.hello.RemoteLogin zurück, aber der client kennt diese klasse nicht. nimm sie in den classpath mit auf.


----------



## siassei84 (2. Jun 2007)

HoaX hat gesagt.:
			
		

> du bekommt vom server ein objekt vom typ example.hello.RemoteLogin zurück, aber der client kennt diese klasse nicht. nimm sie in den classpath mit auf.


Er muss sie doch nicht kennen. Die Klasse lädt der Client automatisch vom Server und mittlerweile (1.5) könnte der Client auch das Interface vom Server laden.


----------



## HoaX (2. Jun 2007)

sicher? ich kenn diese probleme halt von meiner j2ee anwendung ... hast du n link wo man das nachlesen kann?


----------



## heidiweber (2. Jun 2007)

Hallo,

ich habe mal mein Projekt hier als ZIP-File geuppt:

http://people.freenet.de/myjava/HeidiJava.zip

Es sind 2 JAR-Files - einmal der Server und einmal der Client.

Beide sind so lauffähig. 

Sobald ich den Client so aufrufe (in Eclipse als VmArgument):
-Djava.security.policy=javapolicy1

Beim Server so:
-Djava.security.policy=javapolicy

Und dann den SecurityManager im Code aktiviere - ist jetzt ausgesternt - kommt die Fehlermeldung:


```
Client exception: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
	at java.security.AccessController.checkPermission(AccessController.java:427)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
	at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
	at java.net.Socket.connect(Socket.java:513)
	at java.net.Socket.connect(Socket.java:469)
	at java.net.Socket.<init>(Socket.java:366)
	at java.net.Socket.<init>(Socket.java:179)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
	at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at example.hello.Client.main(Client.java:21)
```

Was mache ich da falsch? Binde ich das falsche Objekt an die Registry? Ich weiß echt nicht mehr weiter...
Wäre super, wenn mir helfen könntest


Vielen lieben Dank
cu
Heidi


----------



## HoaX (2. Jun 2007)

is ja schön das du uns das projekt zeigst, aber ohne sourcecode bringt uns das nicht viel ...


----------



## Guest (2. Jun 2007)

Fangen wir mal damit an, dass das hier Quatsch ist.
	
	
	
	





```
grant { 
permission java.net.SocketPermission "192.168.0.2:1099", "connect, 
accept, resolve"; 
permission java.security.AllPermission "", "";
}
```
Wenn du schon alles zulassen willst, dann wie folgt. Den Rest kannst du dir sparen.
	
	
	
	





```
grant { 
   permission java.security.AllPermission; 
}
```


----------



## heidiweber (2. Jun 2007)

Vielen Dank euch allen

Ich kann es gar nicht glauben - aber so wies aussieht, funktionierts 

 Ich werde mich am Montag wg. der genauen Lösung nochmals melden.

Wünsche euch allen eine schöne Nacht mit den Smashing Pumpkins

 Bis Montag

 cu
 Heidi


----------



## heidiweber (7. Jun 2007)

Hallo,

ich möchte noch kurz erklären an was das gelegen hat (bzw. das was ich denke):

Der folgende VM-Parameter hat viel geholfen:
-Djava.security.debug="policy,jar,scl,access,failure"

Er konnte die Policy-Datei nicht finden, da ich die einmal als VM-Argument übergeben habe (der richtige Pfad). Dann hatte ich im Code noch:
System.setProperty("java.security.policy", "clients.policy");

Aber die Policy-Datei heisst: client.policy

Erschlagt mich bitte nicht. Ich habe das "s" echt nicht gesehen....

Da ich den Server und den CLient in unterschiedlichen Projekten, mit unterschiedlichen Packages, habe, kam dann die Meldung:


```
Client exception: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at example.hello.Client.main(Client.java:25)
Caused by: java.lang.ClassNotFoundException: example.hello.interfaces.RemoteLogin
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
	at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
	at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
```
Ich habe dann herausgefunden, dass die Packages, indem sich die Interfaces befinden, den gleichen Package-Namen haben müssen. --> Kann mir vielleicht noch jemand erklären, warum das so ist (Classloader??) ?

Aber jetzt läufts endlich...
VIelen Dank noch an euch allen für die Hilfe

Einen schönen (Feier-)Tag, falls ihr heute frei habt.
Liebe Grüße
Heidi


----------

