Zaman uyumsuz benim ACL eklenti ile müdahale

2 Cevap php

Ben sadece emin bir kullanıcı bir eylemi gerçekleştirmeden önce doğrulanmış olduğundan emin olmak için benim site ile gitmek için bir eklenti hazırlandı. Bu eklentisi:

class Booze_Plugin_AclPlugin extends Zend_Controller_Plugin_Abstract{

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $auth = Booze_Permissions_Auth::getInstance();
    $acl = Zend_Registry::get('acl');

    if(!$auth->hasIdentity())
    {
        $role = Booze_Permissions_Roles::GUEST;
    }
    else
    {
        $role = $auth->getUser()->role;
    }

    $resource = $request->getControllerName();
    $privilege = $request->getActionName();

    if(!$acl->isAllowed($role, $resource, $privilege))
    {
        Booze_Log::log("ACLPlugin: Sent to login");

        $request->setControllerName('login');
        $request->setActionName('index');
        $request->setDispatched(false);
    }
}

}

Bu uyumsuz olmayan sayfalar için iş gibi görünüyor. Ancak, bir iş, bir kontrolör uyumsuz işlevleri gerçekleştirmek için sahip. Bu, kontrolör (ilgili bölümleri) 'dir:

class AsyncController extends Zend_Controller_Action{

public function init()
{

    if(!$this->getRequest()->isXMLHttpRequest())
    {
        $this->_forward('index', 'index');
    }

    $this->_helper->viewRenderer->setNoRender();
    $this->_helper->getHelper('layout')->disableLayout();
 }

 public function addcommentAction()
 {
    $params = $this->getDecoded('comment', true);
    $params_array = (array)$params;

    $auth = Booze_Permissions_Auth::getInstance();
    if(!$auth->hasIdentity())
    {
        $this->getResponse()->setBody("Guest");
    }

    $params_array['user_id'] = $auth->getUser('user_id');
    $params_array['store_id'] = Booze_Storage::get('store_id');

    if($this->comments->insertComment($params_array))
    {
        $this->getResponse()->setBody("success");
    }
    else
    {
        $this->getResponse()->setBody("CommentFail");
    }
 }

Ben misafir olarak imzalanan bile uyumsuz fonksiyon addcommentAction, çağırdığınızda, giriş denetleyicisi beni almaz. Ben, ancak, giriş kontrol ünitesi için html gönderiyor, ama sadece benim tarayıcıda görünmüyor ki, kundakçı dışarı bulduk. Aklımda bu uyumsuz denetleyici olduğu gerçeği ile ilgili bir şey olmalı, init, görünüm oluşturma ve düzeni kapalı. Onunla karıştırmasını denedim, ve eklenti yönlendirme her zaman işler ve kendini gösterir emin olmak için güvenilir bir yol anlamaya olamaz. Herhangi bir yardım olağanüstü olurdu.

2 Cevap

Ben bu eklentisi bir IsAllowed () kısmen eklersiniz:

if(!$acl->isAllowed($role, $resource, $privilege))
{
    if(!$this->getRequest()->isXMLHttpRequest())
    {
        //@todo getResponse
        $response->setBody(Zend_Json::encode(array('result'=>'fail', 'reason'=>'Need login');
        $response->sendResponse();
        exit;
    }

    Booze_Log::log("ACLPlugin: Sent to login");

    $request->setControllerName('login');
    $request->setActionName('index');
    $request->setDispatched(false);
}

Sizin uyumsuz sayfada sonucu 'başarısız' olduğu zaman JSON incloming kolu daha.

have you tried to do a header() redirect? like:

$this->_helper->getHelper('Redirector')->setCode(303)
                                       ->setExit(false)
                                       ->setGotoSimple('index', 'login');

Düzenleme: yorumunuzda sayd gibi, doğru html (login) olsun - Eğer istek uyumsuz ise, giriş eylem kontrol ve sonra javascript istek kodu işlemek bazı hata kodu geri dönmek değil mi?