JSF benutzerspezifisches Menu

Status
Nicht offen für weitere Antworten.

bolda

Mitglied
Tach zusammen,

Angenommen ich habe für "User 1" folgendes Menu:

Home
News
Statistiken
Auswertungen
Mutationen

und für "User 2" folgendes:

Home
News
Statistiken


Meine Frage dazu lautet:
Wie mache ich so etwas am einfachsten?

Ich habe schon so etwas versucht:
Code:
<h:commandLink action="#{...}" value="Home" rendered="#{User.allowedHome}"/>
<h:commandLink action="#{...}" value="News" rendered="#{User.allowedNews}"/>
<h:commandLink action="#{...}" value="Statistiken" rendered="#{User.allowedStatistik}"/>
<h:commandLink action="#{...}" value="Auswertungen" rendered="#{User.allowedAuswertungen}"/>
<h:commandLink action="#{...}" value="Mutationen" rendered="#{User.allowedMutationen}"/>
Das würde jedoch heissen, dass ich für jeden Menueintrag eine eigene Methode schreiben müsste und das möchte ich eigentlich nicht.

Weiss jemand von euch wie das einfacher geht?


Gruss
Bolda
 

WeirdAl

Bekanntes Mitglied
Du brauchst so gesehen für jeden Menüeintrag nur eine Variable die einen getter und setter hat. Dann kannst du in einer "MenuBean Klasse" die Booleans setzen und nacheinander abrufen.

Alternativ kannst Du alle Variablen einzeln oder als Klasse in die SessionMap (zb isAllowedHome) schreiben und anschließend mit #{sessionScope.isAllowedHome} in der JSP abfragen.

Cu
Alex
 

bolda

Mitglied
Lieber Alex

Danke für deine Antwort.

Aber ich möchte ja verhindern, dass ich für jeden Menueintrag eine eigene Variable im System habe.

Ich möchte das oder so was ähnliches machen:
Code:
<h:commandLink action="#{...}" value="Home" rendered="#{User.allowed('AdminGroup,UserGroup')}"/>
<h:commandLink action="#{...}" value="News" rendered="#{User.allowed('AdminGroup,UserGroup')}"/>
<h:commandLink action="#{...}" value="Statistiken" rendered="#{User.allowed('AdminGroup,UserGroup')}"/>
<h:commandLink action="#{...}" value="Auswertungen" rendered="#{User.allowed('AdminGroup')}"/>
<h:commandLink action="#{...}" value="Mutationen" rendered="#{User.allowed('AdminGroup')}"/>
Wenn das oder so etwas ähnliches gehen würde, könnte ich alles in einer einzigen Methode abarbeiten.

Code:
Public boolean isAllowed(String sMenus) {
    // Gibt true zurück, falls User in einer der Gruppen ist
    return user.isInGroup(sMenus);
}

Gruss
Dänu
 

WeirdAl

Bekanntes Mitglied
Huhu,
selbst erstellte Methoden mit Parametern gibt es nicht in JSF, d.h. auf diese Weise wird es nicht gehen. Aber wie gesagt, wenn du einloggst kannst du in die SessionMap Werte lege und diese dann in der JSP benutzen.

Wenn als Beispiel isAdminGroup und isUserGroup nach dem Login in der Session liegen, kannst Du durch logische Operatoren evtl entscheiden, ob gerendert werden soll oder nicht.

Code:
<h:commandLink action="#{...}" value="Home" rendered="#{sessionScope.isAdminGroup} && #{sessionScope.isUserGroup}""}"/>

Ich hab den Code jetzt nich getestet, aber im Prinzip müsste das so funktionieren.
 

bolda

Mitglied
Hi WeirdAl

Ok, damit kann ich leben. :) Das hiese dann, dass ich pro Usergruppe eine eigene Methode schreiben muss. Das ist auf jeden Fall besser, als pro Menueintrag eine eigene. :?

Gruss
bolda
 

WeirdAl

Bekanntes Mitglied
Hi,
du müsstest gar keine Methode schreiben, sondern nur bei der login-action die SessionMap mit Boolean Werten füllen und dann in der JSP abrufen.
Jedoch würde ich die Lösung mit der einen Methode pro Gruppe bevorzugen, da ich ungerne Logik (&& Operator) in die View packe.

Cu
Alex
 

bolda

Mitglied
Hi

So, ich habe das Problem nun folgendermassen gelöst:

Ich habe eine extra Klasse gemacht (MenuHandler). In dieser habe ich folgende Methoden:

Code:
public boolean isAllowedNews(){return isAllowed("Administrators,Helpdesk,UserGruppe1,UserGruppe2");}
public boolean isAllowedStatistik(){return isAllowed("Administrators,UserGruppe2");}
public boolean isAllowedAuswertung(){return isAllowed("Administrators,UserGruppe1");}
public boolean isAllowedMutation(){return isAllowed("Administrators");}
	
	private boolean isAllowed(String sGroups) {
		boolean retVal = false;		
		//Usergruppen welche beim Login eingelesen wurden
		Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
		// Berechtigte Gruppen für Menu
		String[] part = sGroups.split(",");
		for(int i=0;i<part.length;i++) {
			try {
				if ((Boolean)sessionMap.get(part[i])){
					retVal = true;
					break;
				}				
			} catch (Exception e) {}						
		}	
		return retVal;
	}

In der JSP habe ich dann beim rendered jeweils die richtige Methode angezogen:

Code:
<t:div styleClass="cl_nav_top"><h:commandLink action="home" value="Home"/></t:div>
<t:div styleClass="cl_nav_top"><h:commandLink action="news" value="News" rendered="#{menuHandler.allowedNews}"/></t:div>
<t:div styleClass="cl_nav_top"><h:commandLink action="statistik" value="Statistik" rendered="#{menuHandler.allowedStatistik}"/></t:div>
...
...


Gruss
bolda
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Menu dynamisch erstellen Allgemeines EE 3
G JSF Menu Allgemeines EE 2

Ähnliche Java Themen


Oben