# [Design] Rollenbasierendes Benutzermanagement



## Gumble (19. Okt 2005)

Hallöchen,
da Benutzer eine zentrale Stelle in einer Webapp sind, möchte ich ein schickes und erweiterbares User-Modell - die Organisations/Projekt-struktur will auch irgendwie mit verwurstet werden, da diese Dinge eng miteinander verflochten sind. 
Grundlegendes: ich verwenden JBOSS als AS und jBPM als Workflow-Engine. Mit letzteren sollen Prozesse verarbeitet werden in denen verschiedene Nutzer, verschiedene Aufgaben haben bzw dynamisch erhalten. Die Aufgaben sollten zwar rollengebunden sein, aber es gibt immer nur genau einen Verantwortlichen. Ist der im Urlaub oder sonst nicht verfügbar gibt es einen Substitute. Falls da wiederum was nicht passt muss es zu einem Chef weitergeleitet werden (der hat auch eine Ersatzperson). Alle Geschäftsvorfälle resp. konkrete Workflowausführungen resp. Prozessinstanzen (jBPM-Jargon) sind außerdem einer bestimmten Projektversion zugeordnet. Jede Version hat eigene Responsibilities. Hab schon ein ersten Entwurf fuer ein physikalisches Datenbankschema gemacht, aber ich kriegst irgendwie nicht hochgeladen :/ 
Wie erstellt man sowas am Besten? Gibt es Anleitungen oder empfehlenswerte Vorgehensweisen? Konkrete Hilfe zu meinem Fall ist natürlich auch willkommen  Btw, wills als Objektmodell entwerfen, dass per Hibernate O/R gemapped wird. Modellieren tu ich aber auch immer irgendwie per ERM...

Meine zweite Frage ist praktischer Natur. Da ich natürlich bestehende Technologien weitgehend einsetzen möchte, wird die Userauthentication JAAS-based. Soweit so gut - in meinem Bastelprototypen hab ich auch schon eine FORM login und die SecurityDomain zeigt auf ein 'DatabaseServerLoginModule'. Nun hier mein Problem: das Userprofil soll in Form eines UserBeans (btw nutze JSF) in der Session hinterlegt werden - wie bekomme ich NACH einem erfolgreichen JAAS login (j_security_check) die Gelegenheit weitere Initialisierungen zu machen? Anfangs wollte ich ein eigenes LoginModul schreiben (vom DB abgeleitet) wusste aber nicht an welcher Stelle (das Ende?) ich ansetzen soll und vor allem woher ich das Requestobjekt hole. Dann hab ich mal ein 'Valve' ausprobiert - das setzt ja ganz weit unten an - so hab ich sogar Zugriff auf j_password und j_username und konnte mit letzteren auch mein Userbean initialisieren - nur geschieht das immer- auch bei mißglückten JAAS login und das ist ja nicht Sinn der Sache.

Achja, das Usermodell sollte noch jPortal tauglich sein - das Thema ist aber bei mir erstmal ein nice-to-have-Feature, deswegen hab ich es erstmal weggelassen um mein Projekt nicht unnötig zu verkomplizieren.

Achja nochwas:
wieso funktioniert das:
	
	
	
	





```
<form name="logonForm" action="j_security_check" METHOD=POST>
  <input type="text" name="j_username" maxlength=20>
  <input type="password" name="j_password" maxlength=20>
  <input type="submit" value="Log In">
</form>
```
 aber mit JSF nicht?
	
	
	
	





```
<h:form id="logonForm2>
  <h:inputText id="j_username"></h:inputText>
  <h:inputText id="j_password"></h:inputText> 
  <h:commandButton action="j_security_check" value="Log In" />
</h:form>
```
 Es tut sich gar nämlich gar nix ???:L


----------



## KSG9|sebastian (19. Okt 2005)

Schreib dir ein eigenes DatabaseLoginModul. 
Ist im Endeffekt nicht schwierig:

Parameter in der xml-Konfig:

userCol  - Spalte für Benutzername
passCol - Spalte für Passwort
connectionURL - VerbindungsURL zum DB-Server
connectionUser - DB User
connectionPass - DB Password

Was dein Loginmodul machen muss:

- Verbindung aufbauen
- User/Pass überprüfen
- Wenn korrekt:
 - Benutzerdaten auslesen
 - Rollen u. Gruppen auslesen
- Wenn falsch:
 - error zurück


----------



## Gumble (19. Okt 2005)

KSG9|sebastian hat gesagt.:
			
		

> Schreib dir ein eigenes DatabaseLoginModul.
> Ist im Endeffekt nicht schwierig:
> 
> Parameter in der xml-Konfig:
> ...


Hab ich mir auch schon überlegt und auch angefangen, aber ich sehe den Sinn ehrlich gesagt nicht: das bestehende Modul macht doch alles wichtige schon?
	
	
	
	





```
java.lang.Object
  extended by org.jboss.security.auth.spi.AbstractServerLoginModule 
      extended by org.jboss.security.auth.spi.UsernamePasswordLoginModule 
          extended by org.jboss.security.auth.spi.DatabaseServerLoginModule
```
Es authorisiert mich gegen genau eine Tabelle - und die kann ich ja per Hand in den Parameter konfigurieren. Die innere Authentication bzw Authorization macht ja meine WF-Engine anhand des UserBeans. Das RoleMapping (z.B. _<module-option name = "rolesQuery">SELECT ROLEID, 'Roles' FROM JMS_ROLES WHERE USERID=?</module-option>_) das dieses Modul bietet, bräuchte ich sogar gar nicht. 
Nun ist die Frage, an welche Stelle kann ich dieses Bean mit den nötigen Informationen füllen? Meinetwegen im LoginModul - aber wo genau? Find irgendwie keine passende Funktion  ???:L 
Geh ich vielleicht prinzipiell einen falschen Weg? JAAS setzt ja (wann und wo auch immer) im LoginContext ein Subject-Object mit Principals (korrigiert mich bitte falls ich Mist erzähle) - vielleicht sollte man hier ansetzen?


----------

