2016-05-03 10 views
0

ユーザーに特定の役割がある場合にのみ、デフォルトのサービスを上書きする3つのサービスがあります。特定のユーザーロールのサービスをオーバーライドする

さらに良い。新しいサービスで現在のユーザー/セキュリティを注入します。 サービスは、ユーザーロールのチェックを実行し、元のサービスを呼び出します。

私はそれにsecurity.contextを注入しようとしました。しかし$security->getToken()nullを返します。

コントローラでは正常に動作します。私のサービスで現在のユーザーを取得するにはどうすればよいですか?これは私がしたいことです:

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

コンストラクタにセキュリティコンテキストがまだ情報を持っていない場合は、メソッドを呼び出す必要があります – Matteo

+0

ありがとう、あなたのヒントが私の問題を解決しました。 – psren

答えて

1

サービスの作成時に、securityContextは現在のユーザーを認識していませんでした。セキュリティは、アプリケーションが実行され、依存関係の解決ではなく、満たされます。

次のコードが機能します。

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); 
    } 
} 

Matteo!ありがとうございました!

関連する問題