0

正常に動作している ACL ツリーを構築するモジュールがあります。

config/autoload ディレクトリにはナビゲーション構成ファイルもあり、エントリに関連付けられたリソースとともにアプリケーション構造の詳細が示されています。また、アプリケーション モジュール構成にナビゲーション ファクトリがあります。

これはすべて正常に機能しており、ログインしたユーザーのロールの権限と、ナビゲーション構成のページに対するリソースに基づいてメニューをレンダリングしています。

私が解決できないのは、ユーザーがアクセスできないページ (レンダリングされたナビゲーション メニューに隠されているページ) へのアクセスを防ぐ方法です。これをモジュール内で管理したいと思います。

Module.php ファイルの onBootstrap 関数で、ACL に対して isAllowed を実行し、リダイレクトする必要があると想定しています (この質問のように、 module.php から別のコントローラー/アクションに転送します)。ただし、 isAllowed は、クエリを実行するリソースが必要なようです。これは、ナビゲーション構成から取得する必要があります。

isAllowed 関数で必要なリソースをハードコーディングすれば、これを機能させることができます。事実上、現在のページ リクエストのリソースをナビゲーション構成から取得する必要があるだけです。

これは標準機能であるに違いないと確信していますが、具体的な例は見つかりません。

どんな助けでも感謝します。

クリス

4

2 に答える 2

0

これはあなたが探しているものですか、それとも onBootstrap メソッド内から構成にアクセスする方法を探していますか?

public function onBootstrap($event) {
    $matched_route = $event->getRouteMatch()->getMatchedRouteName();
    $someOtherClass = new MyClassThatAuthenticatesRoutes();
    if(!($someOtherClass->isAllowed($matched_route)){
        $response = $event->getResponse();
        $response->setStatusCode(401);
        $response->setReasonPhrase('Not allowed!');
        return $response;
    }

構成だけを探している場合は、次のように移動できます。

 $sm = $e->getApplication()->getServiceManager();
 $config = $sm->get('config');
于 2014-04-11T21:21:02.243 に答える
0

ACL のルートを一致させる必要がある場合は、次のようなことを検討してください。

/**
 * Retrieve the route match
 * 
 * @return string
 */
protected function getMatchRoute()
{
    $router  = $this->getServiceLocator()->get('router');
    $request = $this->getServiceLocator()->get('request');      

    $this->routeMatch = $router->match($request)->getMatchedRouteName();

    return $this->routeMatch;
}

次に、コントローラーで:

// note, $acl is just a class I wrote to extend class Zend\Permissions\Acl\Acl
// because I needed additional functionality    
$acl = new \PATH_TO\Acl\Acl(); 

// checkAcl(), just however you plan on handling permissions
// $role is obviously just that, the role of the user, where ever 
// you are setting that.
// the second param is from the method in the above code block which is the 
// resource (page) you are wanting to check against
$access = $acl->checkAcl($role, $this->getMatchRoute());

// they don't have access so redirect them
if (!$access)
{
    return $this->redirect()->toRoute('your_route', array());
}

これ以上のコードが必要な場合はお知らせください。

于 2014-05-16T02:27:22.970 に答える