2

私はzf2から始めて、多対多の権限/役割を処理する必要があります。ZfcRbacを使用します。

だから私はユーザー/階層ロール(テーブル名=ロール)/権限でマッピングを作成します

そして、拒否ポリシーでいくつかのガードを作成します。

私のガード、マッピング、データベースは問題ありません。

私の HierarchicalRole エンティティは次のようになります。

class HierarchicalRole implements HierarchicalRoleInterface

そして、今のところバクラからもらったオリジナルと同じです。

私のユーザーエンティティは次のようになります:

class User extends ZfcUserEntity implements IdentityInterface

    /**
 * @var \Doctrine\Common\Collections\Collection
 * @ORM\ManyToMany(targetEntity="HierarchicalRole")
 * @ORM\JoinTable(
 *     name="user_role_linker",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="idUser")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 * )
 */
protected $roles;

および役割は、コンストラクターで次のように構築されます。

function __construct() {
    $this->roles = new ArrayCollection();
}

zend developerper ツールを使用ZfcRbac\Collector\RbacCollectorすると、実際にログインしているユーザー (権限、子供、主な役割など) に必要なすべてを表示できます。

私の質問は次のとおりです。アクセスが許可されたリンクのみを表示できるユーザーのために、動的ナビゲーションを生成する方法は? . また、ユーザーがログインしていないときに接続を確認し、ログインしているときに非表示にします...

私はまだ初心者ですが、可能であれば、このモジュールを使用して優れた動的ナビゲーションを行うための例を詳しく説明していただければ幸いです。

EDIT(5月28日) これまでのところ、私は常に解決策を探していますが、私の試みはまだ役に立ちませんでした..ここで見つけることができます: Spiffyナビゲーション まだ完全に機能していません。

4

1 に答える 1

2

ZfcRbac が (ZF2) Zend/Navigation と連携する方法を紹介します。データベースにパーミッションの定義があるので、このセクションは省略します。

ナビゲーションを追加するページと権限を定義します。

config/global.phpPHP:

return array(
        'navigation' => array(
            'default' => array(
                array(
                    'label' => 'Contracts',
                    'route' => 'contract',
                    'action' => 'list',
                    'permission' => 'contract.list',
                    'pages' => array(
                         array(
                            'label'  => 'New contract',
                            'route'  => 'contract',
                            'action' => 'add',
                            'permission' => 'contract.add',
                         )
                     )
                )
            )
        ),
        'service_manager' => array(
            'factories' => array(
                'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
            )
        )
    );

リスナーを作成します (/module/Application/src/Application/Authorization/RbacListener.php):

<?php

namespace Application\Authorization;

use Zend\EventManager\EventInterface;
use Zend\Navigation\Page\AbstractPage;
use ZfcRbac\Service\AuthorizationServiceInterface;

class RbacListener
{
    /**
     * @var AuthorizationServiceInterface
     */
    protected $authorizationService;

    /**
     * @param AuthorizationServiceInterface $authorizationService
     */
    public function __construct(AuthorizationServiceInterface $authorizationService)
    {
        $this->authorizationService = $authorizationService;
    }

    /**
     * @param  EventInterface $event
     * @return bool|void
     */
    public function accept(EventInterface $event)
    {
        $page = $event->getParam('page');

        if (!$page instanceof AbstractPage) {
            return;
        }

        $permission = $page->getPermission();

        if (is_null($permission)) {
            $event->stopPropagation();
            return false;
        }

        $event->stopPropagation();

        return $this->authorizationService->isGranted($permission);
    }
}

RbacListener のファクトリーを作成します (/module/Application/src/Application/Factory/RbacListenerFactory.php):

<?php

namespace Application\Factory;

use Application\Authorization\RbacListener;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class RbacListenerFactory implements FactoryInterface
{
    /**
     * {@inheritDoc}
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $authorizationService = $serviceLocator->get('ZfcRbac\Service\AuthorizationService');

        return new RbacListener($authorizationService);
    }
}

RbacListenerFactory を ServiceManager (/module/Application/config/module.config.php) に追加します。

<?php

return array(
    'service_manager' => array(
        'factories' => array(
            'Application\Authorization\RbacListener' => 'Application\Factory\RbacListenerFactory',
        ),
    ),
);

Zend ナビゲーション ビュー ヘルパーの isAllowed メソッドにイベントをアタッチします (最後に、Zend ナビゲーション ビュー ヘルパーの isAllowed メソッドにイベントをアタッチします)。

<?php

public function onBootstrap(MvcEvent $event)
{
    $application        = $event->getApplication();
    $eventManager       = $application->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager;
    $serviceManager     = $application->getServiceManager();
    $rbacListener       = $serviceManager->get('Application\Authorization\RbacListener');

    $sharedEventManager->attach(
        'Zend\View\Helper\Navigation\AbstractHelper',
        'isAllowed',
        array($rbacListener, 'accept')
    );
}

ビューまたはレイアウトでメニューをレンダリングするには:

<?php echo $this->navigation('navigation')->menu(); ?>

私はこのコードを使用していますが、非常にうまく機能します。以下に基づいています。

于 2015-05-02T09:28:22.630 に答える