# Probleme mit SecruityManager + RMI



## Gast2 (24. Mai 2008)

Wie kann man dem SecrutiyManager in der policy Datei sagen, dass er alles erlauben soll?

Code:



```
public class TankServer {

    public static void main(String[] args)
    {
    	System.setSecurityManager( new RMISecurityManager() ) ;
        try {
            Naming.bind("rmi://localhost/Tank",
                        new TankImpl() );
        } catch(Exception e) {
            // Registrieren des Remote-Objects fehlgeschlagen
        }       
    }
}
```




```
Exception in thread "main" java.lang.ExceptionInInitializerError
	at org.lwjgl.Sys.createImplementation(Sys.java:111)
	at org.lwjgl.Sys.<clinit>(Sys.java:100)
	at org.lwjgl.opengl.GLContext.<clinit>(GLContext.java:111)
	at org.lwjgl.opengl.GL11.glGetError(GL11.java:1283)
	at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:215)
	at org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:161)
	at org.newdawn.slick.Image.<init>(Image.java:152)
	at org.newdawn.slick.SpriteSheet.<init>(SpriteSheet.java:111)
	at org.newdawn.slick.SpriteSheet.<init>(SpriteSheet.java:97)
	at org.newdawn.slick.SpriteSheet.<init>(SpriteSheet.java:84)
	at server.TankImpl.init(TankImpl.java:56)
	at server.TankImpl.<init>(TankImpl.java:41)
	at server.TankServer.main(TankServer.java:15)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission org.lwjgl.util.Debug 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.lang.Boolean.getBoolean(Unknown Source)
	at org.lwjgl.LWJGLUtil$4.run(LWJGLUtil.java:451)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.lwjgl.LWJGLUtil.getPrivilegedBoolean(LWJGLUtil.java:449)
	at org.lwjgl.LWJGLUtil.<clinit>(LWJGLUtil.java:268)
	... 13 more
```


----------



## Gast2 (24. Mai 2008)

okay hab vergessen die policy datei mit zugeben...
jetzt bekomm ich folgende Fehlermeldung auf meinem client


```
java.rmi.NotBoundException: Tank
	at sun.rmi.registry.RegistryImpl.lookup(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Unknown Source)
	at client.ClientTank.init(ClientTank.java:121)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:345)
	at client.ClientTank.main(ClientTank.java:106)
```

hat diese Fehlermeldung was mit registry zu tun????


----------



## semi (24. Mai 2008)

SirWayne hat gesagt.:
			
		

> Wie kann man dem SecrutiyManager in der policy Datei sagen, dass er alles erlauben soll?




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



			
				SirWayne hat gesagt.:
			
		

> ...hat diese Fehlermeldung was mit registry zu tun????


Sieht so aus 

```
public class TankServer {

    public static void main(String[] args)
    {
    	System.setSecurityManager( new RMISecurityManager() ) ;
        try {
            Naming.bind("Tank", new TankImpl() );
        } catch(Exception e) {
            // Registrieren des Remote-Objects fehlgeschlagen
        }       
    }
}
```

Hast du überhaupt die RMI-Registry im Hintergrund am Laufen?


----------



## Gast2 (24. Mai 2008)

ja hab ich...


----------



## semi (24. Mai 2008)

SirWayne hat gesagt.:
			
		

> ja hab ich...


Heisst das, es läuft jetzt wieder? Hast du die Zeile
	
	
	
	





```
Naming.bind("rmi://localhost/Tank", new TankImpl() );
```
durch das hier ersetzt?
	
	
	
	





```
Naming.bind("Tank", new TankImpl() );
```
Wenn es immer noch nicht läuft, dann zeig mal wie TankImpl und das dazugehörige Interface Tank aussieht. Die Klassen- bzw. Interface deklaration reicht.


----------



## Guest (24. Mai 2008)

nein es funktioniert leider nicht =(... des von oben hab ich auch alles schon versucht

Interface


```
public interface Tank extends Remote{

	 public HashMap<String, Player> update(GameContainer container, int delta,String playerKey) throws RemoteException ;

	 public boolean addPlayer(String playerName) throws RemoteException;
	 public SpriteSheet getSpriteSheet()throws RemoteException;
	 public TiledMap getTiledMap()throws RemoteException;
	 public HashMap<String, Player> getPlayers() throws RemoteException ;

}
```

Client

```
public class ClientTank extends BasicGame{

 public static void main(String[] args)
    {
            AppGameContainer container;
			try {
				container = new AppGameContainer(new ClientTank(), 800, 600, false);
				container.start();    
			} catch (SlickException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
           
  
    }

	@Override
	public void init(GameContainer container) throws SlickException {
		try {
			if (System.getSecurityManager() == null) {
				System.setSecurityManager(new RMISecurityManager());
				}
			
			Registry registry = LocateRegistry.getRegistry();
			myTank = (Tank)registry.lookup("Tank");
			
			//myTank = (Tank) Naming.lookup("rmi://localhost/Tank");
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
```

Server

```
public class TankServer {

    public static void main(String[] args)
    {
    	System.setSecurityManager( new RMISecurityManager() ) ;
       
    	
    	try {
    		Registry registry = LocateRegistry.getRegistry();
    		
            registry.rebind("Tank", new TankImpl());
            //Naming.bind("rmi://localhost/Tank",new TankImpl());
        } catch(Exception e) {
            // Registrieren des Remote-Objects fehlgeschlagen
        }       
    }
}
```


```
public class TankImpl extends UnicastRemoteObject implements Tank
{

Methoden vom Interface
}
```


----------



## semi (24. Mai 2008)

Rufst du in TankImpl den super-Konstruktor auf? Was ist jetzt die Fehlermeldung und wie startest du den Server und Client?
Was gibt das hier aus?
	
	
	
	





```
System.out.println(Arrays.toString(LocateRegistry.getRegistry().list()));
```


----------



## FArt (25. Mai 2008)

Die Exception, die du beim bind bekommen kannst schluckst du einfach.
Annahme: es tritt eine Exception beim bind auf dem Server auf, deswegen kann der Client das Objekt in der Registry nicht sehen.


----------



## Gast2 (25. Mai 2008)

Server start ich so...
Ausgabe beim System.out... ist []

```
package server;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Arrays;


public class TankServer {

	public TankServer()
	{
        System.setProperty("ignoreStubClasses", "true");    
        System.setProperty("java.rmi.server.codebase", "file:.\\bin\\");
    	System.setProperty("java.security.policy",
    	"=file:.\\java.policy");

    	System.setSecurityManager( new RMISecurityManager() ) ;
    	try {
    		System.out.println("Registry erzeugen");
    		Registry registry = LocateRegistry.createRegistry(1098);
    		System.out.println("Registry Liste:"+ Arrays.toString(LocateRegistry.getRegistry().list()));
            registry.rebind("Tank", new TankImpl());
            //Naming.bind("rmi://localhost/Tank",new TankImpl());
        } catch(Exception e) {
            // Registrieren des Remote-Objects fehlgeschlagen^
        	
        	e.printStackTrace();
        }       
    }	
		
	
	
    public static void main(String[] args)
    {
    	new TankServer();
    }

}
```

und beim cleint kommt beim look up diese exception

```
Exception in thread "main" java.security.AccessControlException: access denied (java.lang.RuntimePermission shutdownHooks)
	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
	at java.security.AccessController.checkPermission(AccessController.java:546)
	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
	at java.lang.Runtime.removeShutdownHook(Runtime.java:218)
	at org.lwjgl.opengl.Display$4.run(Display.java:807)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.lwjgl.opengl.Display.removeShutdownHook(Display.java:805)
	at org.lwjgl.opengl.Display.destroy(Display.java:946)
	at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:379)
	at client.ClientTank.main(ClientTank.java:113)
```



```
@Override
	public void init(GameContainer container) throws SlickException {
		try {
			if (System.getSecurityManager() == null) {
				System.setSecurityManager(new RMISecurityManager());
				}
			
			Registry registry = LocateRegistry.getRegistry();
//			System.out.println(Arrays.toString(LocateRegistry.getRegistry().list()));
			myTank = (Tank)registry.lookup("Tank");
			
			//myTank = (Tank) Naming.lookup("rmi://localhost/Tank");
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```



was meinst du mit exception ignorieren????


----------



## semi (25. Mai 2008)

Mach's doch ganz einfach und probiere zuerst ein einfaches Programm, bevor du an den Einstellungen rumschraubst.
Du startest den Server auf Port 1098, mit dem Client versuchst du aber auf Port 1099 (default) zuzugreifen. Deine 
Policy-Datei wird auch nie gelesen, da die Pfadangabe falsch ist und dadurch wird die OpenGL Library zerschossen,
da sie anscheinend ein Shutdown-Hook installieren möchte.

Lass mal das hier laufen:
Service.java
	
	
	
	





```
package examples.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Service extends Remote
{
   String echo(final String s) throws RemoteException;
}
```
ServiceImpl.java
	
	
	
	





```
package examples.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

class ServiceImpl extends UnicastRemoteObject implements Service
{
   private static final long serialVersionUID = 4805211162114231900L;

   public ServiceImpl() throws RemoteException
   {
      super();
   }

   public String echo(final String s) throws RemoteException
   {
      return s;
   }
}
```
Server.java
	
	
	
	





```
package examples.rmi;

import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server
{
   public static void main(String[] args)
   {
      try
      {
         System.setSecurityManager(new RMISecurityManager());
         Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
         final Service service = new ServiceImpl();
         reg.rebind("Service", service);
      }
      catch(RemoteException e)
      {
         e.printStackTrace();
      }
   }
}
```
Client.java
	
	
	
	





```
package examples.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;

public class Client
{
   public static void main(String[] args)
   {
      try
      {
         System.setSecurityManager(new RMISecurityManager());
         Service service = (Service) Naming.lookup("rmi://localhost/Service");
         System.out.println(service.echo("Buhh!"));
      }
      catch(RemoteException e)
      {
         e.printStackTrace();
      }
      catch(NotBoundException e)
      {
         e.printStackTrace();
      }
      catch(MalformedURLException e)
      {
         e.printStackTrace();
      }
   }
}
```
server.policy
	
	
	
	





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





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

und lass es wie folgt laufen
	
	
	
	





```
java -Djava.security.policy=server.policy examples.rmi.Server
```


```
java -Djava.security.policy=client.policy examples.rmi.Client
```


----------



## Guest (26. Mai 2008)

cool danke lag am pfad....


----------

