UMGT - Gruppen, Rollen, AppProxy usw.

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 18.03.2014, 13:29:46

Hallo Coach,

wenn ich deine Anforderung richtig verstanden habe passt der Ansatz so.
Dazu müsste ich zuerst die Kategorie(n) des Artikels laden, dann die Gruppe der Redakteure aus dieser Kategorie...
Diese kannst du in deinem Daten-Modell vermutlich per loadRelatedObjects() laden.
... und anschließend die Beziehung zwischen dieser Gruppe und dem Artikel herstellen.
Effektiv stellst du ja eine Beziehung zwischen der Sichtbarkeitsberechtigung und dem entsprechenden Benutzer oder (idealerweise) dessen Gruppe (die sich alle Redakteure teilen) her. Das kannst du tun, in dem du $definition oder $definition2 erweiterst oder mit diesen Informationen eine neue anlegst. Das funktioniert genauso, wie du auch die bisherigen angelegt hast.

Das erste Argument von createVisibilityDefinition() nimmt die jenigen Benutzer entgegen, die du in die Definition aufnehmen möchtest.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 21.03.2014, 00:06:13

Guten Abend!

Ich komme nicht wie gewünscht weiter. Wollte mir eine ini-Konfiguration aufbauen und aus dieser die Berechtigungen auslesen.

Code: Alles auswählen

$type = $uM->loadVisibilityDefinitionTypeByName('Article');
            
 foreach($groups AS $group){
     $groupConfig = $aM->getGroupDefintionFromConfig($group);
     $definition = $aM->getVisibilityDefinitionByGroupConfigAndAppProxyTypeAndAppProxy($Article, $type, $groupConfig);
    $uM->createVisibilityDefinition($type, $definition, array(), array($group));
}
getGroupDefintionFromConfig() lädt einfach die Gruppen-Definition aus der Konfigurationsdatei - klappt auch.
dann erstelle ich mir die Defintion der Sichtbarkeit:

Code: Alles auswählen

getVisibilityDefinitionByGroupConfigAndAppProxyTypeAndAppProxy( ..... ) {
$appProxyTypeSection = $groupConfig->getSection($proxyType->getAppObjectName());
        $appProxySection = $appProxyTypeSection->getSection(self::$CONFIG_APPPROXY_SUB_SECTION_NAME);
        $definition = new UmgtVisibilityDefinition();
        $definition->setAppObjectId($appProxy->getObjectId());
        foreach ($appProxySection->getValueNames() AS $appProxy) {
            switch ($appProxy) {
                case "read": $definition->setReadPermission($appProxySection->getValue($appProxy));
                    break;
                case "write": $definition->setWritePermission($appProxySection->getValue($appProxy));
                    break;
                case "link": $definition->setLinkPermission($appProxySection->getValue($appProxy));
                    break;
                case "delete": $definition->setDeletePermission($appProxySection->getValue($appProxy));
                    break;
            }
        }
        return $definition;
}
Klappt auch.
Wenn ich jetzt jedoch versuche das $uM->createVisibilityDefinition($type, $definition, array(), array($group)); durchzuführen, erhalte ich EINEN Eintrag in der Tabelle AppProxy mit den Werten 1,1,1,1.

Was mache ich da falsch?

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 22.03.2014, 11:27:12

Hallo Coach,

kannst du bitte deine Konfiguration posten, ich tue mir schwer an Hand des Codes zu sagen, was falsch läuft.
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 26.03.2014, 09:10:14

Klar. Hier die Privileges:

Code: Alles auswählen

[Administration]
group.1 = "Administratoren"
Article.permission.read  = "1"
Article.permission.write = "1"
Article.permission.link  = "1"
Article.permission.delete= "1"
ArticleCategory.permission.read  = "1"
ArticleCategory.permission.write = "1"
ArticleCategory.permission.link  = "1"
ArticleCategory.permission.delete= "1"
ArticleKeyword.permission.read  = "1"
ArticleKeyword.permission.write = "1"
ArticleKeyword.permission.link  = "1"
ArticleKeyword.permission.delete= "1"

[ModulAdmins]
group.1 = "Artikel - Chefredakteure"
Article.permission.read  = "1"
Article.permission.write = "1"
Article.permission.link  = "0"
Article.permission.delete= "0"
ArticleCategory.permission.read  = "1"
ArticleCategory.permission.write = "1"
ArticleCategory.permission.link  = "1"
ArticleCategory.permission.delete= "0"
ArticleKeyword.permission.read  = "1"
ArticleKeyword.permission.write = "1"
ArticleKeyword.permission.link  = "1"
ArticleKeyword.permission.delete= "1"

[ModulUser]
group.1 = "Artikel - Redakteure der Jugend"
group.2 = "Artikel - Redakteure der AH"
group.3 = "Artikel - Redakteure der Aktiven"
group.4 = "Artikel - Redakteure der Frauen"
group.5 = "Artikel - Redakteure sonstige Bereiche"
Article.permission.read  = "0"
Article.permission.write = "0"
Article.permission.link  = "0"
Article.permission.delete= "0"
ArticleCategory.permission.read  = "1"
ArticleCategory.permission.write = "0"
ArticleCategory.permission.link  = "0"
ArticleCategory.permission.delete= "0"
ArticleKeyword.permission.read  = "1"
ArticleKeyword.permission.write = "1"
ArticleKeyword.permission.link  = "1"
ArticleKeyword.permission.delete= "1"
und meine AppProxyTypes.ini

Code: Alles auswählen

[ProxyTypes]
proxytype.1 = "Article"
proxytype.2 = "ArticleCategory"
proxytype.3 = "ArticleKeyword"

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 26.03.2014, 23:44:38

Hallo Coach,

sorry für die späte Antwort, es hat etwas gebraucht zu verstehen, was du tun möchtest. :)

Wenn ich deinen Code richtig interpretiere, so liegt der Fehler vermutlich darin, dass du keine eigenständigen Objekte pro Definition anlegst. Hier mal ein bisschen Code zum spielen für deinen Anwendungsfall:

Code: Alles auswählen

namespace VENDORabccontroller;

use APFcorepagecontrollerBaseDocumentController;
use APFmodulesgenericormapperdataGenericDomainObject;
use APFmodulesgenericormapperdataGenericORRelationMapper;
use APFmodulesusermanagementbizmodelUmgtVisibilityDefinition;
use APFmodulesusermanagementbizUmgtManager;

class CreateArticleController extends BaseDocumentController {

   public function transformContent() {

      $form = $this->getForm('...');

      $title = $form->getFormElementByName('title');
      $content = $form->getFormElementByName('content');
      $article = $this->createArticle($title->getValue(), $content->getValue());

      $config = $this->getConfiguration('...', '...');

      $umgt = $this->getUmgtManager();

      foreach ($config->getSectionNames() as $section) {
         $groups = $config->getSection($section)->getSection('group');
         $umgtGroups = array();
         foreach ($groups->getSectionNames() as $groupId) {
            $umgtGroups[] = $umgt->loadGroupByID($groupId);
         }

         $visDef = new UmgtVisibilityDefinition();

         // setup permissions
         $articlePermissions = $config->getSection($section)->getSection('Article')->getSection('permission');
         $visDef->setDeletePermission($articlePermissions->getValue('delete'));
         $visDef->setWritePermission($articlePermissions->getValue('write'));
         $visDef->setLinkPermission($articlePermissions->getValue('link'));
         $visDef->setReadPermission($articlePermissions->getValue('read'));

         // reference article id to visibility definition
         $visDef->setAppObjectId($article->getObjectId());

         // get type loaded via database
         $visDefType = $umgt->loadVisibilityDefinitionTypeByName('Article');

         // create definition for each section separately
         $umgt->createVisibilityDefinition($visDefType, $visDef, array(), $umgtGroups);
      }

   }

   /**
    * @param string $title
    * @param string $content
    *
    * @return GenericDomainObject
    */
   private function createArticle($title, $content) {
      $article = new GenericDomainObject('Article');
      $article->setProperty('Title', $title);
      $article->setProperty('Content', $content);
      $this->getOrMapper()->saveObject($article);

      return $article;
   }

   /**
    * @return UmgtManager
    */
   private function getUmgtManager() {
      return ...;
   }

   /**
    * @return GenericORRelationMapper
    */
   private function getOrMapper() {
      return ...;
   }

} 
Hoffe das hilft dir als Gedankennstoss weiter. Die einzelnen Methoden/Bereiche habe ich natürlich etwas statisch implementiert und es gibt noch einiges zu verbessern/generischer zu gestalten. :)
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 27.03.2014, 09:22:36

Okay.. so weit war ich schon mal. Ich habe das so ungefähr übernommen:

Code: Alles auswählen

 
public function setVisibilityDefinitionsForContent($content) {
        $uM = $this->getDiServiceObject('APF\modules\usermanagement\biz', 'UmgtManager');

        $config = $this->getPrivilegeConfigurationFile();
        $proxyType = $content->getObjectName();

        foreach ($config->getSectionNames() as $section) {
            echo $section . "<br />";
            $groups = $config->getSection($section)->getSection(self::$CONFIG_GROUP_SUB_SECTION_NAME);
            $umgtGroups = array();
            foreach ($groups->getValueNames() as $groupName) {
                $group = $uM->loadGroupByName($groups->getValue($groupName));
                if ($group) {
                    $umgtGroups[] = $group;
                }
            }
            foreach ($umgtGroups AS $myGroup) {
                echo "Gruppe" . $myGroup->getDisplayName() . "<br />";
            }

            $visDef = new UmgtVisibilityDefinition();
            $visDef->setAppObjectId($content->getObjectId());
            echo "ObjektId:" . $content->getObjectId() . "<br />";
            $articlePermissions = $config->getSection($section)->getSection($proxyType)->getSection(self::$CONFIG_APPPROXY_SUB_SECTION_NAME);
            echo "Lesen:" . $articlePermissions->getValue('read') . "-Schreiben" . $articlePermissions->getValue('write') . "-Link" . $articlePermissions->getValue('link') . "-Delete" . $articlePermissions->getValue('delete');

            $visDef->setDeletePermission($articlePermissions->getValue('delete'));
            $visDef->setWritePermission($articlePermissions->getValue('write'));
            $visDef->setLinkPermission($articlePermissions->getValue('link'));
            $visDef->setReadPermission($articlePermissions->getValue('read'));

            $visDefType = $uM->loadVisibilityDefinitionTypeByName($proxyType);
            // create definition for each section separately
            $uM->createVisibilityDefinition($visDefType, $visDef, array(), $umgtGroups);

            echo "<br /><br />";
        }
    }
Richtigerweise wird auch folgendes ausgegeben:
Administration
GruppeAdministratoren
ObjektId:1
Lesen:1-Schreiben1-Link1-Delete1

ModulAdmins
GruppeArtikel - Chefredakteure
ObjektId:1
Lesen:1-Schreiben1-Link0-Delete0

ModulUser
GruppeArtikel - Redakteure der Jugend
GruppeArtikel - Redakteure der AH
GruppeArtikel - Redakteure der Aktiven
GruppeArtikel - Redakteure der Frauen
GruppeArtikel - Redakteure sonstige Bereiche
ObjektId:1
Lesen:0-Schreiben0-Link0-Delete0
Trotzdem erhalte ich nur EINEN AppProxy Eintrag :
AppProxyId 1
AppObjectId 1
Read|Write|Link|Delete - Permission jeweils 1

und alle Gruppen sind mit diesem Eintrag verlinkt.

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 27.03.2014, 23:50:54

Hallo Coach,

das ist in der Tat komisch und ich habe auch ein bischen gebraucht um hrauszufinden warum. :roll:

Der dafür verantwortliche Code steckt in der Methode createVisibilityDefinition(). Er sorgt dafür, dass bei gleicher AppObjectId keine neues Obejkt angelegt wird. :( Für diesen Anwendungsfall ist das absolut kontraproduktiv.

Magst du mal die Zeilen:

Code: Alles auswählen

      // try to reuse existing visibility definitions having the same
      // combination of proxy + type!
      $crit = new GenericCriterionObject();
      $crit->addPropertyIndicator('AppObjectId', $definition->getAppObjectId());
      $crit->addRelationIndicator('AppProxy2AppProxyType', $type);
      $storedVisibilityDefinition = $orm->loadObjectByCriterion('AppProxy', $crit);
      if ($storedVisibilityDefinition != null) {
         $definition = $storedVisibilityDefinition;
      } 
aus der Methode entfernen und das nochmal versuchen. Wenn alles klappt, mache ich dafür einen Bug gegen 2.0 auf und schecke das für 2.0.1 und 2.1 ein.

Danke für deine Geduld! :)
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 28.03.2014, 07:11:43

Das sieht doch gleich viel besser aus ;)! Ich hab zu danken.

Dann möchte ich allerdings nen anderen Bug nennen:
Wenn eine Sichtbarkeit jetzt bereits für ein Objekt besteht - also in Verbindung mit einem Benutzer/einer Gruppe und einer Objekt-ID, dann wird diese neu angelegt.

D.h. ich hab z.B. zwei Einträge für einen Chefredakteur für den Artikel 1. Da sollte also ne Prüfung darauf erfolgen. Oder?

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 28.03.2014, 21:54:00

Hallo Coach,
Das sieht doch gleich viel besser aus ;)! Ich hab zu danken.
Super! :)
Dann möchte ich allerdings nen anderen Bug nennen:
Wenn eine Sichtbarkeit jetzt bereits für ein Objekt besteht - also in Verbindung mit einem Benutzer/einer Gruppe und einer Objekt-ID, dann wird diese neu angelegt.
D.h. ich hab z.B. zwei Einträge für einen Chefredakteur für den Artikel 1. Da sollte also ne Prüfung darauf erfolgen. Oder?
Das ist eindeutig eine Folge der obigen Änderung - hier haben wir also ein Chicken-Egg-Dilemma. :D Was ich mir vorstellen könnte, wäre die Abfrage so zu erweitern, dass für eine eindeutige Kombination von AppObjectId, DeletePermission, LinkPermission, WritePermission und ReadPermission nur ein Objekt erzeugt wird. Sollte eine neue Kombination vorliegen, wird ein neues Objekt erzeugt. Dann solltest du für deinen ersten Anwendungsfall immer ein neues Objekt erhalten, da sich die Berechtigung entsprechend zwischen den Gruppen unterscheidet. Im zweiten Fall solltest du dann kein neues Objekt erhalten, da sich nur die Relationen zu Gruppe und Benutzer ändern.

Versuch mal den oben stehenden Code durch folgenden zu erstzen:

Code: Alles auswählen

// try to reuse existing visibility definitions having the same
// combination of proxy, type, and permissions!
$crit = new GenericCriterionObject();

$crit->addRelationIndicator('AppProxy2AppProxyType', $type);

$crit->addPropertyIndicator('AppObjectId', $definition->getAppObjectId());

$crit->addPropertyIndicator('ReadPermission', $definition->getReadPermission());
$crit->addPropertyIndicator('WritePermission', $definition->getWritePermission());
$crit->addPropertyIndicator('LinkPermission', $definition->getLinkPermission());
$crit->addPropertyIndicator('DeletePermission', $definition->getDeletePermission());

$storedVisibilityDefinition = $orm->loadObjectByCriterion('AppProxy', $crit);
if ($storedVisibilityDefinition != null) {
   $definition = $storedVisibilityDefinition;
} 
Viele Grüße,
Christian

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 01.04.2014, 23:30:37

Hallo Coach,

konntest du die Änderung schon ausprobieren?
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 08.04.2014, 21:19:25

sorry, ich bin noch nicht dazu gekommen. Melde mich am Wochenende!

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 03.05.2014, 11:08:24

Hallo Coach,

konntest du dich schon mit dem Thema befassen?
Viele Grüße,
Christian

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von Coach83 » 04.05.2014, 15:36:09

Ja - jetzt endlich hatte ich Zeit dafür.
Passt auch so :-)!

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 04.05.2014, 22:02:41

Perfekt, dann übernehme ich das so in den master-Branch für Release 2.1.
Viele Grüße,
Christian

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

Re: UMGT - Gruppen, Rollen, AppProxy usw.

Beitrag von dr.e. » 07.05.2014, 23:41:09

Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast