# JSF benutzerspezifisches Menu



## bolda (25. Apr 2007)

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:

```
<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 (25. Apr 2007)

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 (26. Apr 2007)

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:

```
<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.


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

Gruss
Dänu


----------



## WeirdAl (26. Apr 2007)

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.


```
<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 (26. Apr 2007)

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 (26. Apr 2007)

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 (27. Apr 2007)

Hi

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

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


```
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:


```
<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


----------

