1

一部のアクセス決定がページ自体に依存する(たとえば、ログインしたユーザーにのみ表示される) ものと、動的モデル オブジェクト/logoutに依存するもの(たとえば、ログインしたユーザーによって書き込まれたかどうかを確認する必要がある場所)の Web プロジェクトがあります。ユーザーまたは彼が管理者の場合)。/article/delete/12341234

今、私は両方をどのように組み合わせるかという問題に直面しています。どんなに試しても、2つだけに頼ることはできません。

  • 一部のページではモデルを使用していないため、モデル ルールを設定できません
  • 一方、モジュラー アプローチの動的アサーションを作成することはできません。Aはデフォルト モジュールに限定されず、管理モジュールでも使用できます。Commentcommentdefault/commentComment

モジュラー ACLを使用して、ユーザーがアクセスを許可されているかどうかを各ページで確認しようとしています。

if (!$acl->isAllowed($user, 'default/secrets', 'mysecrets')) {
    $this->forward('auth', 'login');
    $this->setDispatched(false);
}

また、動的アサーションを使用して、誰かが特定のモデル オブジェクトの編集を許可されているかどうかを確認しています。

// $comment has a method getResourceId() returning 'comment'
if ($acl->isAllowed($user, $comment, 'delete')) {
    // display a link for deletion
}

もちろん、

  • 特定のコメントの削除、および
  • /comment/delete/???? へのアクセス ページ

は同じですが、これは不可能だと思います。2 つのルールを作成する必要があります。

$acl->allow('member', 'default/comment', 'delete');
$acl->allow('member', 'comment', 'delete', new Acl_Assert_CommentAuthor());
$acl->allow('admin', 'comment', 'delete');

場合によっては作業が重複する可能性があるため、これは私には完璧ではないようです。

この問題にアプローチするためのより良い方法はありますか? または、少なくとも次のような一貫した命名スキームを作成する唯一の方法ですmvc:default/commentmodel:comment

4

1 に答える 1

0

私がやった方法、結果を制限するカスタムSQLクエリ、SQLを挿入/削除/変更する前にチェックする関数

そして、アクセス許可をチェックしてこれらの 5 つのテーブルを使用する、私が作成した ACL プラグイン

acl_groups
acl_permession
acl_permession_groups
acl_permession_risource
acl_risource

コード:

class Abc_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{

    /**
     * Return whether a given request (module-controller-action) exists
     *
     * @param Zend_Controller_Request_Abstract $request Request to check
     * @return boolean Whether the action exists
     */
    private function _actionExists(Zend_Controller_Request_Abstract $request)
    {
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();

        // Check controller
        if (!$dispatcher->isDispatchable($request)) {
            return false;
        }

        $class  = $dispatcher->loadClass($dispatcher->getControllerClass($request));
        $method = $dispatcher->formatActionName($request->getActionName());

        return is_callable(array($class, $method));
    }



    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {

        // fetch the current user

        $controller = $request->controller;
        $action = $request->action;

        $logger = Zend_Registry::get('log');



        //prima controlla se sei autenticato e poi controlla se l'azione esiste, cosi non esponi il sito
        $auth = Zend_Auth::getInstance(); /* @var $auth Zend_Auth */
            if($auth->hasIdentity()) {


                if(! $this->_actionExists($request))//l'azione non esiste?
                {
                    $request->setControllerName('error');
                    $request->setActionName('pagenotfound');
                        $logger->notice( " IP: ". $_SERVER['REMOTE_ADDR']. " http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]. " ?" .http_build_query($_REQUEST));
                    return ;
                }

                $allowed = Abc_Action_Helper_CheckPermission::checkPermission($controller, $action);

                if ($allowed !== 1)
                {
                    $request->setControllerName('error');
                    $request->setActionName('noauth');
                }
                //fine azione esiste
            }else{
                                    $request->setControllerName('user');
                $request->setActionName('login');
                return ;
            }


    }//fine preDispatch

}

次に、コードを追加して(短くするために省略しました)、リクエストを記憶し、ログイン後にそこにリダイレクトできます。

于 2012-07-30T09:30:09.670 に答える