4

Symfony2 でアクセス制御を処理するための良い方法を見つけようとしています。

私の要件:

  • アプリケーションの 90% は、認証されたユーザーのみがアクセスできます
  • 多くのコントローラーで、ユーザーが所有者であるかどうかを確認する必要があります
  • ユーザーの役割ごとにいくつかの違いもあります

私がすでにやったこと:

  • JMSSecurityExtraBundle をインストールして、アノテーションを介してパーミッションをチェックする
  • 私のエンティティクラスに定義されたグローバルエース
  • 作成プロセス中にすべてのオブジェクトの所有者のエースを作成します

所有者と役割のチェックは問題ありません。ユーザーを認証する必要があることをグローバルな方法で定義したいだけで、例外 (匿名でアクセスできるサイト) については分離して定義したい (注釈を使用するのが最適です)。ルーティングパターンを介してこれを行いたくありません。

4

2 に答える 2

0

class AceBuilderListener は EventSubscriber を実装します{

private $container;

public function setContainer($container){
    $his->container = $container;
}

public function getSubscribedEvents()
{
    return array(
            Events::prePersist,
            Events::preUpdate,
            Events::preRemove,
            Events::postPersist,
            Events::postUpdate,
            Events::postRemove,
            Events::loadClassMetadata,
    );
}

public function prePersist(){ echo( get_class($entity) ); }
public function preUpdate(){ echo( get_class($entity) ); }
public function preRemove(){ echo( get_class($entity) ); }
public function postPersist(){ echo( get_class($entity) ); }

public function postUpdate(LifecycleEventArgs $args)
{

    $entity = $args->getEntity();
    $entityManager = $args->getEntityManager();

    echo get_class($entity);
    // perhaps you only want to act on some "Product" entity
    if ($entity instanceof Product | x) {
        // ... do something with the Product
    }
}

public function postRemove(){ die( get_class($entity) ); }

public function loadClassMetadata( LoadClassMetadataEventArgs $args ){ 
    $classMetadata = $args->getClassMetadata();
    $entityManager = $args->getEntityManager();

            $user = $this->container->get('security.context')->getToken()->getUser();

            // you can check here if isGranted();
            // and get the entity from the object $classMetadata  
            $this->container->get('security.context')->isGranted('EDIT', $entity);

} 

}

于 2013-09-25T22:58:33.933 に答える
0

あなたが探しているものかどうかはわかりませんが、Event Listenerを試してみましたか?

onKernelController メソッドで検証を行うことができます。次に、さまざまなインターフェイスを作成し、リスナーでコントローラーのタイプを確認できます。

于 2012-07-31T22:02:20.190 に答える