3

私は「プライベート」アプリケーションに取り組んでいます。何をするにもログインする必要があります。これにより、Zend Navigation のロールをロードする際に少し問題が発生します。現在、ブートストラップで Zend Navigation を「初期化」しています。ACL を Zend Nav に追加するまでは問題ありませんでした。問題は、認証ストレージから「userRole」をロードしたいのですが、ユーザーがログインするまでストレージがまだないため、ログインページで「オブジェクト以外のプロパティを取得しようとしています」という警告が表示されることです. これは、ログイン前は認証のストレージに何もないためです。ユーザーがログインして認証が構成されるまで、空になるauth->userRoleため「何もない」ためです。auth->getInstance()->getIdentity()->???

私はログイン ページで Zend Nav を使用していません。実際、ログイン ページには別のレイアウトを使用しています (ナビゲーションはまったくありません)。'if !$auth->hasIdentity'(false) ログイン レイアウトを使用し、システム全体でログイン ページのみを表示します。アプリケーションは完全にプライベートであると言ったので、「ゲスト」ロールなどをデフォルトにするのは「汚い」アプローチのように思えます。ユーザーがログインすると、とにかく認証を再構成する必要があります。ログインページを喜ばせるためだけに一般的な認証IDを設定するのは正しくないようです。

私が得ているのは、Zend Nav の「init」を移動する、または少なくとも構成 ACL 部分を移動するのに適した場所はどこですか? 全体を動かしてもいいですか?

これは、Zend Navigation の bootstrap.php にあるものです。

protected function _initNavigation() {
    $this->_logger->info('Bootstrap ' . __METHOD__);

    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
    $container = new Zend_Navigation($config);
    $acl = new Application_Model_Acl_Acl();
    $role = Zend_Auth::getInstance()->getIdentity()->userRole;
    $view->navigation($container)->setAcl($acl)->setRole($role);
}

'$role = Zend_Auth::getInstance()->getIdentity()->userRole'ブートストラップの実行時に空 (または非オブジェクト) になるのは です。

私のACLはすべてコントローラーで(アクションで)発生するか、ある時点でモデルで発生する可能性がありますが、Webサービスなどは予想していません。モデルに ACL があるため、柔軟性があります (それは「ドメイン」ですよね?

レイアウト、ユーザー エクスペリエンスの目的で、Zend Nav で ACL のみを使用しています。Zend Nav から取得したメニューとリンクは、ユーザーの役割に応じて「グレー表示」、存在しない、またはアクティブ (および表示) になります。たとえば、「ユーザー」の役割は多くの「管理者」オプションを取得しません。これはコントローラーの ACL によって再適用されるため、単純に URL を入力してエリアに到達することもできませんでした。

私のもう1つの考えは、この状況ではログインをブートストラップに移動することを考えるべきかもしれないということでしたが、それが良い考えかどうかもわかりませんか?


編集: これは、フロントコントローラープラグインに入れたコードです:

class Plugins_Controller_ZendNavInit extends Zend_Controller_Plugin_Abstract {

        public function preDispatch(Zend_Controller_Request_Abstract $request) {

            $auth = Zend_Auth::getInstance();

            if ($auth->hasIdentity()) {

                $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
                $container = new Zend_Navigation($config);
                $acl = new Application_Model_Acl_Acl();

                $layout = Zend_Layout::getMvcInstance();
                $view = $layout->getView();

                $role = Zend_Auth::getInstance()->getIdentity()->userRole;
                $view->navigation($container)->setAcl($acl)->setRole($role);
            }
        }
    }

よく働く; もちろん、他のプラグインと同じようにプラグインを登録する必要がありました。また、認証チェックをフロントコントローラープラグインにも移動しました。

4

2 に答える 2

3

ログイン前に匿名ロールを作成し、匿名ユーザー用の非常に短い ACL ポリシーを処理できます。たとえば、認証プラグインを使用して PreDispatch で認証されていないユーザーをキャッチする方法については、この応答を確認してください。

于 2011-04-29T08:14:54.583 に答える
1

Auth ストレージから直接プルすることはありません。Zend_Auth から取得し、そのユーザー セッション中にユーザーの役割が変更された場合は、ログアウト/ログインを強制するか、Zend_Auth ストレージ内の情報を更新する必要があります。Role クラスをセットアップし、ロジックを実行してそこで役割を決定したり、デフォルト (ゲスト) 役割を設定したりする方が簡単だと思います。User ロール クラスは、私の User モデルを拡張し、Zend_Acl_Role_Interface を実装します。次に、Role クラス内からデータベースにクエリを実行できます。私はこれを1日かそこら前に実装し始めましたが、ここに例があります:

<?php

class Zfcms_Acl_Role_User extends Zfcms_Model_Users implement Zend_Acl_Role_Interface {

/**
 * Unique id of Role
 *
 * @var string
 */
protected $_roleId;
public $_inheritsFrom = 'guest';
public $_defaultRole = 'user';

/**
 * Sets the Role identifier
 *
 * @param  string $id
 * @return void
 * Defined by Zend_Acl_Role_Interface; returns the Role identifier
 *
 * @return string
 */
public function getRoleId()
{
    //$auth = Zend_Auth::getInstance();
    if(Zend_Auth::getInstance()->hasIdentity()) 
    {
        $this->_roleId = self::getUserRoleById(Zend_Auth::getInstance()->getIdentity()->user_id);
        return $this->_roleId;
    } 
    elseif(!Zend_Auth::getInstance()->hasIdentity() && !isset($this->role))
    {
        //return 'guest';
        return (string) new Zfcms_Acl_Role_Guest();
    } else {
        throw new Zend_Controller_Action_Exception('Invalid user roleId', 110);
    }
}
public function getDefaultRole()
{
    return $this->_defaultRole;
}
public function getPrivsByRole($role)
{
   //TODO: Design db table to hold privs
}
private function setPrivs()
{
   //TODO: implement
}
/**
 * Defined by Zend_Acl_Role_Interface; returns the Role identifier
 * Proxies to getRoleId()
 *
 * @return string
 */
public function __toString()
{
    return $this->getRoleId();
}
public function getUserRoleById($id)
{
    $this->_id = $id;
    $query = $this->select()
                  ->from('users', array('user_id', 'role'))
                  ->where('user_id = ?', $this->_id);

    $result = $this->fetchAll($query);
    foreach($result as $userRole)
    {
        $role = $userRole->role;
    }
    return $role;
}

}

于 2011-07-22T20:44:41.730 に答える