2016-05-03 33 views
0

Ich habe 3 Dienste, die die Standarddienste nur überschreiben sollten, wenn der Benutzer eine bestimmte Rolle hat.Dienst für bestimmte Benutzerrolle außer Kraft setzen

Oder noch besser. Inject den aktuellen Benutzer/Sicherheit in den neuen Diensten. Der Dienst führt dann die Prüfung für die Benutzerrolle durch und ruft den ursprünglichen Dienst auf.

Ich habe versucht, security.context hinein zu injizieren. Aber dann $security->getToken() gibt null zurück.

In den Controllern funktioniert es gut. Wie kann ich den aktuellen Benutzer in meinen Service aufnehmen? Folgendes möchte ich tun:

class AlwaysVisibleNavigationQueryBuilder extends  NavigationQueryBuilder 
{ 
    public function __construct(\Sulu\Component\Content\Compat\StructureManagerInterface $structureManager, $languageNamespace, SecurityContext $security) 
    { 
     if (in_array('ROLE_SULU_ADMINISTRATOR', $security->getToken()->getRoles())) { 
      // Show unpublished content, too 
      $this->published = false; 
     } 

     parent::__construct($structureManager, $languageNamespace); 
    } 
} 
+1

im Konstruktor der Sicherheitskontext noch nicht die Info haben, müssen Sie die Methode aufrufen – Matteo

+0

Danke, hat Ihr Hinweis mein Problem gelöst. – psren

Antwort

1

Zum Zeitpunkt der Erstellung des Dienstes war dem securityContext der aktuelle Benutzer nicht bekannt. Die Sicherheit wird ausgeführt, wenn die Anwendung ausgeführt wird, und nicht bei Abhängigkeitsauflösung.

Der folgende Code funktioniert.

class AlwaysVisibleNavigationQueryBuilder extends NavigationQueryBuilder 
{ 
    protected $security; 

    public function __construct(\Sulu\Component\Content\Compat\StructureManagerInterface $structureManager, $languageNamespace, SecurityContext $security) 
    { 
     $this->security = $security; 

     parent::__construct($structureManager, $languageNamespace); 
    } 

    public function build($webspaceKey, $locales) 
    { 
     $roles = $this->security->getToken()->getRoles(); 

     if (in_array('ROLE_SULU_ADMINISTRATOR', $roles)) { 
      // Show unpublished content, too 
      $this->published = false; 
     } 

     return parent::build($webspaceKey, $locales); 
    } 
} 

Danke an Matteo!

Verwandte Themen