Fragen zum Usermanagement-Modul

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 11.07.2009, 20:24:12

Zum Thema UMGT habe ich mal eine Frage:

Ich frage mich gerade, wozu es sinnvoll sein soll zwischen Role und Group zu unterscheiden. Es steht zwar in der Doku drin, was das Eine bzw. das Andere bewirken soll, jedoch verstehe ich das noch nicht so wirklich. Ich kann doch auch rein mittels Gruppenzuweisung Rechte auf bestimmte Dinge gewähren oder verbieten!? Aber davon abgesehen habe ich bisher auch vergeblich versucht eine Erklärung für die Felder einer Rolle zu finden. Ich weiß nämlich nicht, warum ich neben dem DisplayName noch einen Namen und einen Wert vergeben muss und was diese für Auswirkungen haben!? Kann es sein, dass die Doku an dieser Stelle etwas lückenhaft ist? Oder habe ich es einfach nur nicht verstanden / überlesen?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 13.07.2009, 12:21:24

Hallo Lutz,

Rechte und Rollen unterscheiden sich auf eine sehr einfache Weise:
  • Rolle = Funktions-Berechtigung
  • Rechte = Objekt-Sichtbarkeit
Wenn du also definieren möchtest, welcher Benutzer welches Objekt einer Anwendung sehen darf (z.B. Seiten eines CMS), dann nutzt du Rechte. Diese weist du über Beziehungen zwischen Gruppen oder Benutzern und dem jeweiligen Objekt (z.B. Seite eines CMS) zu. Die Anzeige würde dann alle Objekte laden, die eine implizite oder explitite Beziehung zu einem eingeloggten Benutzer haben.

Um zu definieren, welche Aktionen ein Benutzer auf für ihn sichtbare Objekte ausüben darf, werden Rollen (explizit: Berechtigungen/Permissions) benutzt. Hat ein Benutzer XYZ die Rolle "Super-Redaktuer", darf er sichtbare Seiten anlegen, bearbeiten, veröffentlichen, löschen, ... hat er nur die Rolle "Kleiner Redakteur", darf er Seiten z.B. nur bearbeiten. Hinter einer Rolle steckt also ein Satz an Funktions-Berechtigungen, die dem Benutzer über diese zugewiesen werden.
Aber davon abgesehen habe ich bisher auch vergeblich versucht eine Erklärung für die Felder einer Rolle zu finden. Ich weiß nämlich nicht, warum ich neben dem DisplayName noch einen Namen und einen Wert vergeben muss und was diese für Auswirkungen haben!?

Eine Rolle sollte einfach einen Namen haben, damit dieser in der Applikation oder der zugehörigen GUI identifizierbar ist. Grundsätzlich ist ein DisplayName nicht relevant für die Funktion und ein "normaler" Benutzer sieht diesen auch garnicht.
Kann es sein, dass die Doku an dieser Stelle etwas lückenhaft ist? Oder habe ich es einfach nur nicht verstanden / überlesen?
Ich war eigentlich der Meinung, dass dazu alles dokumentiert ist und das UML alles sagt. Fehlt dir noch etwas?

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 13.07.2009, 16:01:58

Naja, es fehlt mir insofern etwas, dass auch durch deinen Poste gerade nicht wirklich erklärt wurde, wozu neben DisplayName und Name das Feld Value vorhanden ist!? Dass DisplayName nicht Name sein soll habe nich mir schon gedacht, wozu sonst 2 Felder. Aber das Value-Feld ist für mich immernoch nicht klar!?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Fragen zum Usermanagement-Modul

Beitrag von dr.e. » 14.07.2009, 21:27:32

Hallo Lutz,
Naja, es fehlt mir insofern etwas, dass auch durch deinen Poste gerade nicht wirklich erklärt wurde, wozu neben DisplayName und Name das Feld Value vorhanden ist!? Dass DisplayName nicht Name sein soll habe nich mir schon gedacht, wozu sonst 2 Felder. Aber das Value-Feld ist für mich immernoch nicht klar!?
OK, dann versuche ich das nochmal anders zu erklären:

Rollen und Gruppen haben jeweils ein Attribut "DisplayName", mit dem diese in der Verwaltungsoberfläche identifizierbar sind. Die Objekte selbst sind jedoch "nur" Container für andere, bzw. dienen zum Aufbau von Beziehungen. Eine Rolle assoziiert dabei ein PermissionSet, das wiederum mehrere Permissions kennt. Damit ist es dir möglich, verschiedene Funktionsberechtigungen (Permissions) an eine Rolle zu binden. Über die Zuweisung einer Rolle - oder auch mehrerer Rollen - zu einem Benutzer, erlangt dieser die entsprechenden Berechtigungen. Eine Permission besteht dabei aus einem "DisplayName" (zur einfacheren Referenzierung in der GUI), einem Bezeichner und dessen Wert. So kannst du in einer Applikation z.B. fragen: "Hat ein Benutzer eine Permission mit dem Namen "xyz"? Falls ja, biete ich ihm den Navigationspunkt Löschen auf dem Objekt Seite an." Aus diesem Grund brauchen eine Rolle und ein PermissionSet auch nichts weiter als einen "DisplayName".

Eine Gruppe ist ebenso "nur" ein Gruppierungs-Element und assoziiert ihrerseits wiederum Objekte deiner Wahl (z.B. Seite). Über die zusätzliche Beziehung zu einem Benutzer kann ein Objekt einem Benutzer sichtbar gemacht werden. Beispiel:
Seite <-> Gruppe <-> Benutzer

oder
Seite <-> Benutzer
In deiner Applikation fragst du also ab, wer welche Beziehungen ausbildet und kannst damit z.B. eine Liste füllen. Die Abfrage lautet dabei sinngemäß: "Welche Seiten darf der aktuell eingeloggte Benutzer sehen oder welche Seiten sind mit Gruppen verknüpft, denen der Benutzer zugeordnet ist?".

Ich hoffe, die Verwendung der Permissions wird nun klarer. Falls nicht, poste ich noch ein kleines Code-Snippet, dann sollte es verständlich sein.

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 14.07.2009, 21:51:15

Das war mir soweit dann auch schon klar, aber du sprichst erneut nicht explizit an, wozu man den Bezeichner und den Wert gebrauchen soll!? Das geht wieder nicht aus deiner Ausführung hervor. Dass ich anhand des Namens die Berechtigung in Erfahrung bringen kann ist mir durchaus klar, aber warum nicht dazu den Display-Name nutzen?! Wäre doch genauso möglich? Aber wie gesagt: Mein Hauptaugenmerk liegt auf dem Bezeichner und dem Wert, ich weiß immernoch nicht, wozu ich den Wert gebrauchen sollte!? :( Sorry dafür, dass ich so schwer von KP zu sein scheine!?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Fragen zum Usermanagement-Modul

Beitrag von dr.e. » 14.07.2009, 23:14:03

Hi Lutz,
Das war mir soweit dann auch schon klar, aber du sprichst erneut nicht explizit an, wozu man den Bezeichner und den Wert gebrauchen soll!? Das geht wieder nicht aus deiner Ausführung hervor.
Ok, folgendes Beispiel:
Einem Benutzer ist die Rolle "Super-Redakteur" (=DisplayName) zugewiesen. Diese assoziiert ein PermissionSet mit dem DisplayName "Webseiten-Verwaltung". Dieses Set assoziiert nun folgende Permissions:
    • DisplayName: Seiten bearbeiten
    • Name: editpage
    • Value: true
    • DisplayName: Seiten löschen
    • Name: deletepage
    • Value: true
    • DisplayName: Seiten online stellen
    • Name: publishpage
    • Value: true
Die DisplayNames sind dabei "schöne" Bezeichner für die jeweilige Berechtigung, Name ist das Schlüsselwort, mit dem du die Permission in der Applikation referenzierst und Value ist schließlich der Wert, den du in der Applikation prüfst um abzufragen, ob eine Berechtigung gesetzt ist und wenn ja, auf welchen Wert.
Dass ich anhand des Namens die Berechtigung in Erfahrung bringen kann ist mir durchaus klar, aber warum nicht dazu den Display-Name nutzen?! Wäre doch genauso möglich?
Sicher ist das möglich, nur möchte ich in der GUI einen vernünftigen Wert bzw. eine "schöne" Listenansicht anzeigen, mit der man mehr anfangen kann wie "editpage". Störe dich bitte nicht am Anzeige-Namen, das tut der Funktion keinen Abbruch.
Aber wie gesagt: Mein Hauptaugenmerk liegt auf dem Bezeichner und dem Wert, ich weiß immernoch nicht, wozu ich den Wert gebrauchen sollte!? :( Sorry dafür, dass ich so schwer von KP zu sein scheine!?
Kein Problem. Noch ein kleines Beispiel zum Thema Wert (Pseudocode zur Anzeige eines Menüs für eine Bearbeitungsmaske in einem CMS):

Code: Alles auswählen

$user = $model->*getUser()*;
$permissions = $user->*getPermissions()*;
foreach($permissions as $permission){
   if($permission->getProperty('Name') == 'editpage' && $permission->getProperty('Value') == 'true'){
      echo 'user is allowed to edit a page';
   }
}
Das Beispiel ist sicher aus Performance-Sicht nicht optimal, doch es würde "user is allowed to edit a page" anzeigen, wenn der Benutzer die Berechtigung "editpage" besitzt und dort der Wert "true" enthalten ist.

Ich hoffe das hilft dir weiter.


Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 15.07.2009, 07:27:25

OK, nun habe ich verstanden, wie du dir das gedacht hast, allerdings frage ich mich, ob es überhaupt "true" bedarf, denn wenn ich keinen Eintrag hätte, würde ich genausowenig die Rechte besitzen, als wenn dort ein "false" enthalten wäre!? Oder soll man dadurch eine Möglichkeit enthalten, das Recht noch zu differenzieren wie z.B. "Ja, er hat das Recht" und "Ja, er hat das Recht, aber nur für eigene Beiträge" (zum Beispiel)?

Ich frage mich aber auch, ob es nich sinnvoll wäre auch einer Gruppe ein PermissionSet oder einer Rolle zuordnen zu können, das würde einer Gruppe eine zentralere Rolle zukommen lassen!? Ich persönlich sehe zwar, wozu du die Gruppen gebrauchen willst, aber irgendwie finde ich es überflüssig, da man das auch alles über Permissions regeln kann. In Windows-Netzwerken haben Gruppen ja schließlich auch die Funktion den Benutzern bestimmte Rechte zu gewähren.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Fragen zum Usermanagement-Modul

Beitrag von dr.e. » 15.07.2009, 12:24:25

Hallo Lutz,
Oder soll man dadurch eine Möglichkeit enthalten, das Recht noch zu differenzieren wie z.B. "Ja, er hat das Recht" und "Ja, er hat das Recht, aber nur für eigene Beiträge" (zum Beispiel)?
Exakt, es soll dir die Freiheit ermöglicht werden, mehrstufige Funktionsberechtigungen zu vergeben. Das geht nicht, wenn du nur fragst: "Hat er die Permission oder nicht?".
Ich frage mich aber auch, ob es nich sinnvoll wäre auch einer Gruppe ein PermissionSet oder einer Rolle zuordnen zu können, das würde einer Gruppe eine zentralere Rolle zukommen lassen!?
Nein, denn Gruppen und Rollen sind nicht 1:1 austauschbar. Zudem ist eine Gruppe von der OO-Modellierung her keine natürliche Person, der eine Rolle zukommen könnte. Am Steuer eines Autos sitzen kann auch immer nur einer, obwohl eine Gruppe von Leuten im Auto sitzen kann. ;-)
Ich persönlich sehe zwar, wozu du die Gruppen gebrauchen willst, aber irgendwie finde ich es überflüssig, da man das auch alles über Permissions regeln kann. In Windows-Netzwerken haben Gruppen ja schließlich auch die Funktion den Benutzern bestimmte Rechte zu gewähren.
Aber Windows-Netzwerke haben auch eine Gruppen- und Benutzer-Richtlinie, die quasi die Rollen abbilden. Wenn du jedoch die Permissions in deiner Applikation nicht brauchst, bist du auf Grund des Datenmodells auch nicht gezwungen diese zu nutzen.

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 29.07.2009, 13:45:09

So, ich bin es dann auch mal wieder mit einer Frage zum UMGT ;) Undzwar habe ich ein Registrierungs-Script geschrieben, dass das UMGT-Modul nutzt, um weitere Benutzer hinzuzufügen. Soweit so gut, alles funktioniert. Allerdings gibt es da einen Schönheitsfehler wie ich finde, für den ich noch kein Workaround gefunden habe:

Code: Alles auswählen

// ...
            // Erzeugen eines neuen User-Objekts
            $objectUser = new GenericDomainObject ('User');

            unset ($arrayFormValues['PasswordRepeat']);

            $arrayFormValues['Password'] = md5 ($arrayFormValues['Password']);

            // Übergeben der Variablen an das User-Objekt
            foreach ($arrayFormValues AS $stringKey => $stringValue)
            {
              if (empty ($stringValue) === FALSE)
              {
                $objectUser->setProperty ($stringKey,
                                          $stringValue
                                          );
              }
            }

            unset ($stringKey,
                   $stringValue
                   );

            // Speichern der Benutzerdaten
            $objectUserManager->saveUser ($objectUser);

            // Nachladen des Benutzers
            $objectUser = $objectUserManager->loadUserByUserName ($arrayFormValues['Username']);

            // Gruppe laden
            $objectGroup = $objectUserManager->loadGroupByID (2);

            // Gruppe dem Benutzer zuordnen
            $objectUserManager->assignUser2Groups ($objectUser,
                                                   array ($objectGroup)
                                                   );

            HeaderManager::forward ('/content/userAccessLogin');
            exit;
// ...
Wieso muss ich nach dem Speichern des Benutzers das User-Objekt neu laden, damit die ID im Objekt enthalten ist? Gibt es da eine einfachere Variante von? Wäre es nicht sinnvoller, dass die ID im Objekt automatisch ersetzt wird, wenn die Methode saveUser() angewandt wird? Es funktioniert zwar so wie ich es habe, aber sinnvoller fände ich es, würde die ID automatisch ersetzt werden?!
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Fragen zum Usermanagement-Modul

Beitrag von Megger » 29.07.2009, 18:39:01

Code: Alles auswählen

$objectUserManager->loadUserByID($objectUserManager->saveUser($objectUser));
Würde auch gehen, kommt aber im Endeffekt auf das gleiche raus.

Ein

Code: Alles auswählen

$objectUser = $objectUserManager->saveUser($objectUser);
wäre natürlich schöner, da gebe ich dir recht. Ich habe es bis jetzt auch immer über das obrige Beispiel gelöst, aber nie so wirklich darüber nachgedacht.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 29.07.2009, 21:00:41

Ähh... Der UserManager gibt die ID zurück? Ah, cool, dann reicht es ja auch das folgendermaßen zu lösen:

Code: Alles auswählen

$integerID = $objectUserManager->saveUser ($objectUser);
$objectUser->setAttribute ('UserID', $integerID);
!?
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Fragen zum Usermanagement-Modul

Beitrag von Megger » 29.07.2009, 22:15:55

Soweit ich weiß gibt er die ID zurück, also sollte das kein Problem darstellen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Fragen zum Usermanagement-Modul

Beitrag von dr.e. » 29.07.2009, 22:25:10

Hi,

sorry für die späte Antwort, dafür aber vollständig:
Wieso muss ich nach dem Speichern des Benutzers das User-Objekt neu laden, damit die ID im Objekt enthalten ist? Gibt es da eine einfachere Variante von? Wäre es nicht sinnvoller, dass die ID im Objekt automatisch ersetzt wird, wenn die Methode saveUser() angewandt wird? Es funktioniert zwar so wie ich es habe, aber sinnvoller fände ich es, würde die ID automatisch ersetzt werden?!
Es macht durchaus Sinn, wenn du ein Objekt weiterverwenden kannst - richtig. Das war bisher nur insofern nicht notwenidg, weil die Business-Methoden des UMGT dir die ID des Objekts zurückgegeben haben. Mehr brauchst du oft nicht. Das GenericDomainObject spielt dabei nur eine untergeordnete Rolle, sprich es dient "nur" dem Datentransfer und ist ein der Anwendung "unterliegendes" Objekt.

An sich spricht jedoch Code-technisch nichts dagegen, das Objekt im umgtManager zu manipulieren, damit du es hinterher weiter verwenden kannst. Das wären dann jeweils Änderungen an der Methodik der Übergabe (Referenz statt Wert) und einige Zeilen Code mehr im umgtManager. Soll ich das für 1.11 einplanen?

Code: Alles auswählen

$objectUserManager->loadUserByID($objectUserManager->saveUser($objectUser));
Dieser Code zeigt genau die Idee der Implementierung, sprich ein Persistenz-Objekt ist es immer erst dann, wenn es "frisch" geladen wird. Erst dann erhält es eine Referenz auf die Daten-Komponente und seine Zuordnung in der Datenbank (ID). Es ist jedoch völlig legal, den Objektbaum mit noch nicht gespeicherten Objekten aufzubauen und anschließend zu speichern/upzudaten. Das kann der GORM auflösen und auf dieses Feature setzt auch der umgtManager. Deine Vorgehensweise ist also so vollkommen richtig.

Code: Alles auswählen

$integerID = $objectUserManager->saveUser ($objectUser);
$objectUser->setAttribute ('UserID', $integerID);
Exakt. Sofern du das gleiche Objekt nochmal wiederverwenden musst/willst, reicht das.

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Fragen zum Usermanagement-Modul

Beitrag von MrNiceGuy » 29.07.2009, 22:45:52

Ich habe nach der Information, dass die ID zurückgegeben wird, erstmal den Quellcode des UMGT und des GORM durchstöbert. Im Grunde ist es ja sogar ein Feature, dass über den GORM auch allen anderen Bereichen zuteil werden kann, wenn die Änderung eingepflegt wird. Ich denke, dass es Sinn macht die ID automatisch gesetzt wird, denn in welchen Fällen braucht man vom gleichen Objekt mit gleichen Daten mehrere Datensätze?! Da entspräche es eher meinem Verständnis für jeden neuen Datensatz ein neues Objekt zu erzeugen.
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Fragen zum Usermanagement-Modul

Beitrag von dr.e. » 29.07.2009, 23:21:30

Hi Lutz,

ok, dann plane ich das ein. Feature-Forcast gibt es im entsprechenden Forum.

Viele Grüße,
Christian
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast