myFaces: Problem mit Navigation

Ono Sendai

Grünschnabel
Hallo Leute,
habe ein vertracktes Problem, das ich mir momentan nicht erklären kann.
Situation:
web-Anwendwung mit Login Seite, diese leitet bei erfolgreicher Authentifizierung auf eine Willkommensseite, von dort aus können andere Seiten über die Navigation angesteuert werden. Der Login und die Weiterleitung zur welcome.faces klappen.

Problem:
Die Navigation ist mit CommandLinks realisiert, die als action-Attribut den Outcome für die entsprechenden Navigation-Rules enthalten. Dennoch wird bei jedem Klick immer die letzte Verwendete Navigation-Rule angewandt, statt der zutreffenden.

Inhalt der faces-config:
Code:
	<navigation-rule>
		<from-view-id>*</from-view-id>
		<navigation-case>
			<from-outcome>home</from-outcome>
			<to-view-id>/WEB-INF/pages/welcome.xhtml</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>reporting</from-outcome>
			<to-view-id>/WEB-INF/pages/reporting.xhtml</to-view-id>
		</navigation-case>
		
	</navigation-rule>
	
	<navigation-rule>
		<from-view-id>/login.xhtml</from-view-id>
		<navigation-case>
			<from-outcome>success</from-outcome>
			<to-view-id>/WEB-INF/pages/welcome.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>

CommandLinks im Menu:
Code:
<ul>
	<li><h:commandLink id="naviHome" action="welcome" value="nochmal Home" /> </li>
	<li><h:commandLink id="naviReporting" action="reporting" value="Reporting" /> </li>
</ul>

File-Struktur:
Code:
Web-Content
   |- login.xhtml
   |-WEB-INF
      |-pages
         |-welcome.xhtml
         |-reporting.xhtml

Umgebung:
MyFaces 1.1.5 mit Facelets , Tomcat 5.5, Java 5, Eclipse 3.2.2

Wenn ich den Link der zur Seite reporting.faces führen soll anklicke, bekomme ich die Fehlermeldung, dass die Seite welcome.faces nicht verfügbar wäre (obwohl sie es ist, denn nach erfolgreichem Login komme auch über die 2. Navigation-Rule auch dorthin).

Nach etwas herumspielen habe ich rausgefunden dass scheinbar immer die letzte Navigation-Rule ausgeführt wird. In diesem Fall bedeutet es, dass egal worauf ich klicke, es wird die Navi-Rule ausgeführt, die nach erfolgreichem Login gegriffen hat.

Hat jemand eine Idee woran das liegen könnte?
 
Okay, habe heraus gefunden, warum es nicht geht, suche aber noch immer nach einer geeigneten Möglichkeit es zum Laufen zu kriegen.

Der Fehler im obigen Ansatz ist, dass die CommandLinks letztlich in einem GET-Request enden, der auf project/WEB-INF/... verweist. Das wird vom Servlet-Container direkt unterbunden, da hilft also auch alle Konfiguration nichts. Die Weiterleitung nach dem Login funktionierte trotzdem, aber das liegt daran, dass in diesem Fall ein Form abgeschickt wurde, was per POST passiert, somit wurde die Auslieferung der Seiten vom Servlet übernommen und das darf auf den Inhalt von WEB-INF zugreifen.

So weit so gut. Wie kann ich also auf elegante Weise dafür sorgen, dass meine Seiten in einem geschützten Bereich liegen und nur nach erfolgtem Login zugänglich sind?
Ist doch eigentlich ein Standardproblem.

Security-Manager wie Acegi fallen dabei raus, da diese für die Anwendung überdimensioniert wären.

Bin für alle Anregungen dankbar...
 
Habs dann schlussendlich mit einem Filter gelöst.
Die Seiten liegen in einem Verzeichnis uasserhalb von WEB-INF, auf das also prinzipiell jeder zugreifen kann. Der Filter entscheidet dann, ob der User authentifiziert ist und leitet auf die Seite unterhalb von pages/ weiter, alle anderen Zugriffe auf pages/ werden geblockt.

Anderer Ansatz wäre mit einem Phase-Listener oder aber einem Security Framework.
 

Neue Beiträge

Zurück