コントローラプラグインを使用して認証プラグインに取り組んでいます。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...
}
}