DefaultContext bei Tomcat 5

MartinLeim

Grünschnabel
Ich bin mir jetzt nicht ganz sicher, ob das hier das richtige Forum ist, da es mehr um die Tomcat-Administration denn um die Java-Programmierung geht. Wenn der Thread später hier also nicht mehr ist, wird er wol woanders sein ;)

Folgendes Problem: Ich möchte eine bestimmte Webressource mit einer eigenen JAAS-Authentifizierung schützen, die "Standard-Tools" wie Admin und Manager aber so lassen, d.h. die Authentifikation aus der tomcat-users.xml.
Dazu müsste ich eigentlich nur die MemoryRealm (also die mit der Datei) als Realm für den Standard-Kontext setzen und für meine eigene Ressource einen eigenen Kontext. Leider ist das nur die Theorie, praktisch klappt das nicht :-\
So sieht meine server.xml ausschnittsweise aus:

Code:
       <Context path="">
          <Realm className="org.apache.catalina.realm.MemoryRealm" />
        </Context>
        
        <Context path="/jaas-examples">
          <Realm className="org.apache.catalina.realm.JAASRealm" debug="3"
            appName="TestApplication" userClassNames="UserPrincipal"
            roleClassNames="RolePrincipal" />
        </Context>

Laut Tomcat-Doku sollte mit leerem path-Attribut der Standard-Kontext angelegt werden, der verwendet wird, wenn sonst nichts festgelegt ist.

Leider bekomm ich nun bei einer Authentifikation z.B. beim Manager die Fehlermeldung, dass keine Login-Module (JAAS) festgelegt sind. Das ist seltsam, da Tomcat ja gar kein JAAS, sondern MemoryRealm verwenden soll!

Wenn ich einen der Realms nicht in ein Context-Element verschachtele, dann kann zwar die Anmeldung vonstatten gehen, allerdings kann ich dann nicht mehr verschiedene Realms verwenden :(


Weiß da einer Rat?
 
Hallo!

Kleines Beispiel:
Wir schützen Anwendungen /manager und /admin wie gehabt mittels des MemoryRealms durch die Tomcat-users.xml, lassen die Wurzel (root) / jedoch durch unseren eigenen Realm (der einfachheit halber wieder ein MemoryRealm) ->my-tomcat-users.xml schützen.

Server.xml:
Code:
<Server port="8005" shutdown="SHUTDOWN">
	<GlobalNamingResources>
		<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved">
    </Resource>
		<ResourceParams name="UserDatabase">
			<parameter>
				<name>factory</name>
				<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
			</parameter>
			<parameter>
				<name>pathname</name>
				<value>conf/tomcat-users.xml</value>
			</parameter>
		</ResourceParams>
	</GlobalNamingResources>
	
	<Service name="Catalina">
		<Connector port="8080"/>
		<Connector port="8009" protocol="AJP/1.3"/>
		<Engine name="Catalina" defaultHost="localhost">
			<Logger className="org.apache.catalina.logger.FileLogger"/>
			<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
			<Host name="localhost" appBase="webapps">
				<Context path="" reloadable="true" docBase="fooRoot">
					<Realm className="org.apache.catalina.realm.MemoryRealm" debug="0" pathname="conf/my-tomcat-users.xml"/>
				</Context>
			</Host>
		</Engine>
	</Service>
</Server>

Tomcat-users.xml:
Code:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="admin" password="admin" roles="tomcat,role1,admin,manager"/>
</tomcat-users>

my-tomcat-users.xml:
Code:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="admin"/>
  <role rolename="manager"/>
  <role rolename="foo"/>
  <user username="tom" password="foobar" roles="admin,manager,foo"/>
</tomcat-users>

WEB-INF/Web.xml meiner Root Anwendung (fooRoot) unterhalb von Webapps
Code:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
	<display-name>Welcome to Tomcat</display-name>
	<description>
     Welcome to Tomcat
  </description>
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>everything</web-resource-name>
			<url-pattern>/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>foo</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
	<auth-method>BASIC</auth-method>
	<realm-name>my-tomcat</realm-name>
	</login-config>
</web-app>

Damit wird die Webresource / über die Datei my-tomcat-users.xml geschützt und /admin sowei /manager über die tomca-users.xml.

Btw. ein leeres path="" Attribut bei einem Context sagt nur aus, dass dieser Context auf die URL http://somehost:someport/ reagieren soll. Damit definierst du nicht den DefaultContext. Zur Definition des DefaultContexts gibt es ein eigenes Konfigurationselement (DefaultContext ;-) ). Ist dies nicht gesetzt wird trotzdem ein DefaultContext mit allen Tomcat Standardwerten Initialisiert.

Gruß Tom
 
Hallo Thomas,

erstmal danke für deine Antwort.
Leider hilft mir die bisher nicht weiter :(

Soweit ich das sehe ist bei dir nur anders, dass du den UserDatabaseRealm verwendest und ich einen MemoryRealm.
Aber auch damit das gleiche Spiel: Geb ich den allgemeinen Realm an, ohne dass er in einen Context eingebettet ist, wird dieser immer verwendet, lass ich ihn weg und weise nur einen Realm für einen bestimmten Kontext (auch wenn dieser leer ist oder wenn es der DefaultContext ist) zu, bekomm ich nach wie vor die Meldung, dass keine Anmeldemodule definiert seien.
 
So, ich habs jetzt hingekriegt - ich hab die Context-Definition von der globalen server.xml in die Datei conf/[enginename]/[hostname]/[irgendwas].xml verlagert, und nun erkennt er die Pfade.

Das Thema hat sich also erledigt.
 
Thomas Darimont hat gesagt.:
Btw. ein leeres path="" Attribut bei einem Context sagt nur aus, dass dieser Context auf die URL http://somehost:someport/ reagieren soll. Damit definierst du nicht den DefaultContext. Zur Definition des DefaultContexts gibt es ein eigenes Konfigurationselement (DefaultContext ;-) ). Ist dies nicht gesetzt wird trotzdem ein DefaultContext mit allen Tomcat Standardwerten Initialisiert.
Hi,

ich denke mal das ist so nicht ganz richtig. Auf Jakarta (http://jakarta.apache.org/tomcat/tomcat-4.0-doc/config/context.html) liest man diesbezüglich folgendes:

Attribute: path
Description:
The context path of this web application, which is matched against the beginning of each request URI to select the appropriate web application for processing. All of the context paths within a particular Host must be unique. If you specify a context path of an empty string (""), you are defining the default web application for this Host, which will process all requests not assigned to other Contexts.

LG,
Ernest
 

Neue Beiträge

Zurück