Eigene Tomcat Realm Implementierung

Topsen

Mitglied
Hallo,

ich möchte gerne ein eigenes Realm für TomCat implementieren. Überall lese ich das es ganz einfach ist und ich nur eine eigene Klasse von org.apache.catalina.realm.RealmBase ableiten muss und eigene Funktionen dazu schreibe.
Aber hat vielleicht jemand mal Quelltextschnipsel, das ich mir das mal anschauen kann.
Oder wie ich da vorgehe.
Kann wohl programmieren, aber bin Neuling auf dem Gebiet, Servlets, TomCat, etc.
Bin C++ Programmierer, der umschult, hehe

MfG,

Tobsen
 
Also ich habe jetzt eine eigene Klasse in meinem WEB-INF/lib Verzeichnis erzählt und will sie von JDBCRealm erben lassen.
Bekomme nun aber ständig die Fehlermeldung

"The type org.apache.catalina.realm.RealmBase cannot be resolved. It is indirectly referenced from required .class files JDBCAuthRealm.java"

Ich habe das catalina-optinal...jar aus dem server/lib ins common/lib kopiert und dem build path hinzugefügt.

Was mache ich falsch?
 
Hallo!

Ich denke, dass du diese Tomcat internen Klassen auch noch referenzen auf andere Klassen haben, die du nicht mit in den Classpath gelegt hast. Leg deine eigene RealmImplentierung in ein zusaetzliches Jar im common/lib Verzeichnis ab. Dort abgelegte jars sind sowohl fuer den Server als auch fuer Webanwendungen verfuegbar. Wenn das dann nicht klappt legst du es einfach in server/lib ab.

Gruss Tom
 
Ich habe mein eigenes Realm jetzt soweit lauffähig.
Nun möchte ich aber auf Klassenfunktionen aus meinem Projekt zugreifen. Diese kennt er aber wohl nicht.
Meine RealmImpl. liegt in einem jar unter server/lib.
Wie bekomme ich das jetzt hin, das ich Klassen aus meinem Projekt benutzen kann?
 
Hallo!

Klassen die aus jars des server/lib Verzeichnis geladen wurden, stehen den Webapps nicht zur Verfuegung. Hast du's schon mal mit dem commons/lib Verzeichnis versucht... Klassen die aus diesem Verzeichnis geladen wurden stehen dem Server UND den Webapps zur Verfuegung.

Btw. koenntest du vielleicht deine Beispielhafte Realm Implementierung posten?

Gruss Tom
 
Ich bin jetzt soweit, das er mein eigenes Realm ausführt.
In dessen authentificate Funktion möchte ich nun ein spezielles Principal zurückgeben, in dem ich noch eine Datenbankverbindung ablege.
Diese Verbindung möchte ich dann später in meinem JSP aus dem Principal wieder auslesen.
Habe folgenden Quellcode verwendet:
authentificate Funktion:
Code:
    public Principal authenticate(String username, String password) 
    {
      	if(username != null && password != null)
    	{
    		if (!username.equals(""))
    	    {
    			try
    	        {
    				//Versuch Aufbau Connection mit Userdaten
    				Connection connect = new Connection("localhost", 11002, username, password);
    				//Bei Erfolg Übergabe der Connection an das Principal
    				if(...... == null)
    					return null;
    				if(....... > 0)
    				{
    					CustomPrincipal princ = new CustomPrincipal("rss");
    					princ.setConnection(connect);
    					return princ;
    				}
    	        }
    	        catch(Exception e )
    	        {
    	        	e.printStackTrace();
    	         }
    	    }
    	}
      	return null;
    }
eigene Principal Klasse:
Code:
public class CustomPrincipal implements Principal 
	{ 
		private final String name; 
		public Connection connection = null;
		
	public CustomPrincipal(String name) { 
		this.name = name; 
	} 
	
	public String getName() { 
		return name; 
	} 
	
	public void setConnection(Connection connection)
	{
		this.connection = connection;
	}
		
	public Connection getConnection()
	{
		if(this.connection != null)
			return this.connection;
		return null;
	}
	
	public String toString() { 
		return getName(); 
	} 
  }
In meiner JSP sieht hole ich mir das Principal
Code:
request.getUserPrincipal()
und übergebe es in eine Klassenfuntkion.
Dort will ich die Datenbankverbindung nutzen. Also mache ich einen TypeCast
Code:
((CustomPrincipal)request.getUserPrincipal()).getDatabaseConn()
Aber der wirft eine Exception.
Wo ist das Problem, ... Darf ich überhaupt ein Interface mit Funktionen erweitern? Wenn ja, eigentlich brauche ich doch dann gar kein Type Cast oder? Grübel Grübel.....

Wie mache ich das am besten?
 
Zuletzt bearbeitet:
Hallo,

das Thema ist zwar schon etwas älter, aber ich hoffe, es ist noch jemand hier und kann mir helfen.

Ich bin im Thema Tomcat Authentifizierung relativ neu. Bisher habe ich den Standard mit der xml Datei verwendet. Nun habe ich ein Projekt, bei dem ich ein wenig andere Funktionalität benötige.

Konkret soll es so ablaufen, dass man auf einer Seite seinen Usernamen und Passwort eingibt und dann beim Aufruf diese Daten genommen werden, in eine XML Struktur verpackt werden und ein HTTP Request mit dem XML im Body losgeschickt wird. Als Response kommt dann wieder ein XML Body, den ich dann zerlegen kann. In diesem wir auch die Rolle des Users zurückgeliefert und of die Authentifizierung erfolgreich war oder nicht.

Das ganze ist ein JSF Facelets Anwendung, aber das hat ja mir der Authentifizierung nicht viel zu tun, da das ja reine Tomcat Sache ist.

Ich habe jetzt versucht ein Realm zu schreiben, dass diese Funktionalität bietet. Ich denke auch, dass das geklappt hat. Das habe ich ich eine jar Datei verpackt und ins Server/lib Verzeichnis kopiert. Dann habe ich in der Server.xml die Klasse in der Realm Konfiguration eingetragen. Auch habe ich im Package eine mbean-descriptor.xml Datei abgelegt, wie es in der Tomcat Doku beschrieben ist.

Leider bekomme ich beim Tomcat Start nun den Fehler:
Code:
20.03.2007 10:40:10 org.apache.tomcat.util.digester.Digester startElement
SCHWERWIEGEND: Begin event threw exception
java.lang.ClassNotFoundException: org.apache.catalina.realm.DKVAuth
        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 org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:204)
        at org.apache.tomcat.util.digester.Rule.begin(Rule.java:152)
        at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1275)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
        at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1337)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2740)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:645)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1561)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:489)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:523)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:266)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)

Ich hoffe, es kann mir jemand weiterhelfen, da das Thema in der Doku und im Netz nicht gerade ausführlich behandelt wird. Ein kompletter Beispielcode für ein eigenes Realm wäre echt spitze.

Viele Grüße
Michael

edit: In der Zwischenzeit konnte ich das Problem mit Hilfe eines Kollegen lösen. Sollte jemand am gleichen Problem sitzen, bitte einfach bei mir melden.
 
Zuletzt bearbeitet:
Zurück