0

コントローラプラグインを使用して認証プラグインに取り組んでいます。application.iniファイル内でナビゲーション構成を定義し、それとデータベースユーザーレコードを使用してACLを動的にロードし、Zend_Navigationに適用します。このビットは、メニューを正常にロードし、ユーザーが表示できるページのみを表示するため、機能します。

ただし、これはユーザーがページに直接アクセスすることを妨げるものではありません。私がやりたいのは、ユーザーがコントローラープラグイン内でアクセスできないページにアクセスするタイミングを特定して、ユーザーの要求を認証ページにリダイレクトできるようにすることです。

Zend_Navigationから現在のページを取得する関数があるはずだと思っていたのですが、見つからないので…存在しないのかもしれません。

とにかく、これは私の完全なコントローラープラグインです。誰かが解決策を見ますか?

<?php
class Pog_Model_AuthPlugin extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $oRequest)
    {
        /**
         * Load user
         */
        $oAuth = Zend_Auth::getInstance();
        $oDbUsers = new Pog_Model_DbTable_Users();

        if (!$oAuth->hasIdentity())
        {
            $oUser       = $oDbUsers->createRow();
            $oUser->name = "guest";
            $oUser->setReadOnly(true);
        }
        else
        {
            $oUser = $oAuth->getIdentity();
            $oUser->setTable($oDbUsers);
        }

        /**
         * Load ACL
         */    
        $oAcl = new Zend_Acl();
        $oAcl->addRole($oUser->name);


        /**
         * Add current user privileges
         */
        $oPrivileges = $oUser->getPrivileges();
        foreach ($oPrivileges as $oPrivilege)
        {
            if (!$oAcl->has($oPrivilege->resource))
                $oAcl->addResource($oPrivilege->resource);

            $oAcl->allow($oUser->name, $oPrivilege->resource, $oPrivilege->privilege);
        }


        /**
         * Load Navigation view helper
         */
        $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $oNavigation   = $oViewRenderer->view->navigation();


        /**
         * Add remaining Navigation resources
         */
        foreach ($oNavigation->getPages() as $oPage)
        {
            if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
                $oAcl->addResource($oPage->getResource());
        }


        /**
         * Set ACL and Role
         */
        $oNavigation->setAcl($oAcl)->setRole($oUser->name);


        /**
         * Check if use is allowed to be here
         */
        ...MAGIC GOES HERE...
    }
}
4

2 に答える 2

4

次のように現在のナビゲーションページを取得できるはずだと思います。

     /**
     * Load Navigation view helper
     */
    $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $oNavigation   = $oViewRenderer->view->navigation();

    /*@var $active array */        
    $active = $oNavigation->findActive($oNavigation->getContainer());

    /*@var $activePage Zend_Navigation_Page_Mvc */   
    $activePage =  $active['page'];

    // example of getting page info        
    var_dump($activePage->getLabel(), $activePage->getController(), $activePage->getAction());

お役に立てれば。

于 2011-04-14T12:10:35.397 に答える
0

何らかの理由で私のセットアップで Marcin のソリューションを動作させることができないため、これが私が使用したソリューションです。

私はもう少し考えて、問題に対する素晴らしい簡単な解決策を考えました. ナビゲーション モジュールを使用してアクティブなページを見つけるのではなく、自分で見つけます。すでにページを反復処理しているため、Controller と Action を比較するのは簡単です。これらが両方とも一致する場合、Active ページができました。

新しい getPages() foreach ループは次のようになります。

$oCurrentPage = null;
foreach ($oNavigation->getPages() as $oPage)
{
    /**
     * Check for Current Page
     */
    if ($oPage->getController() == $oRequest->getControllerName()
      && $oPage->getAction() == $oRequest->getActionName())
        $oCurrentPage = $oPage;


    /**
     * Add Resource, if missing
     */
    if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
        $oAcl->addResource($oPage->getResource());
}
于 2011-04-14T14:12:11.847 に答える