Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 如何在zf3的Module.php中实现acl和授权_Zend Framework2_Zend Framework3 - Fatal编程技术网

Zend framework2 如何在zf3的Module.php中实现acl和授权

Zend framework2 如何在zf3的Module.php中实现acl和授权,zend-framework2,zend-framework3,Zend Framework2,Zend Framework3,我正在zf3中开发相册应用程序。我在应用程序中添加了acl功能,如下所示: AlbumController.php class AlbumController extends AbstractActionController { protected $role; public function onDispatch(\Zend\Mvc\MvcEvent $e) { $userSession = new Container('user'); if (!isset($userSess

我正在zf3中开发相册应用程序。我在应用程序中添加了acl功能,如下所示:

AlbumController.php

class AlbumController extends AbstractActionController
{
protected $role;
public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $userSession = new Container('user');
    if (!isset($userSession->email)) {
        return $this->redirect()->toRoute('login');
    }
    else {
        $this->role = $userSession->role;
        parent::onDispatch($e);
      }
    }
public function checkPermission($role,$action)
{
  if($role == 'admin'){
    $acl = new Acl();
    if ($acl->isAllowed('admin', 'AlbumController', $action)) {
        return true;
    }
  }
  return false;
}
public function editAction()
{
  $action = 'edit';
  $permission = $this->checkPermission($this->role,$action);
  if (!$permission) {
      $this->flashMessenger()->addMessage('<div class="alert alert-  danger" role="alert"><b>You dont have the privilege to edit!!</b></div>');
      return $this->redirect()->toRoute('album');
  }
  $id = (int) $this->params()->fromRoute('id', 0);

    if (0 === $id) {
        return $this->redirect()->toRoute('album', ['action' => 'add']);
    }
    try {
        $album = $this->table->getAlbum($id);
    } catch (\Exception $e) {
        return $this->redirect()->toRoute('album', ['action' => 'index']);
    }

    $form = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    $viewData = ['id' => $id, 'form' => $form];
    if (! $request->isPost()) {
        return $viewData;
    }

    $form->setInputFilter($album->getInputFilter());
    $form->setData($request->getPost());
    $edit = $request->getPost('submit', 'Cancel');
    if($edit == 'Cancel'){
      $this->flashMessenger()->addMessage('<div class="alert alert-danger" role="alert"><b>Cancelled by User...!!</b></div>');
      return $this->redirect()->toRoute('album');
    }
    if (! $form->isValid()) {
        $this->flashMessenger()->addMessage('<div class="alert alert-danger" role="alert"><b>Failed to Update...!!</b></div>');
        return $viewData;
    }else{
      $this->table->saveAlbum($album);
      $this->flashMessenger()->addMessage('<div class="alert alert-success" role="alert"><b>Record Updated Successfully...!!</b></div>');
    }
    // Redirect to album list
    return $this->redirect()->toRoute('album', ['action' => 'index']);
}
}
<?php
 namespace Album;

 use Album\Controller\AlbumController;
 use Album\Model\Album;
 use Album\Model\AlbumTable;
 use Zend\Db\Adapter\AdapterInterface;
 use Zend\Db\ResultSet\ResultSet;
 use Zend\Db\TableGateway\TableGateway;
 use Zend\ModuleManager\Feature\ConfigProviderInterface;
 use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
 use Album\Model\LoginTable;

 class Module implements ConfigProviderInterface
 {
  public function getConfig()
  {
     return include __DIR__ . '/../config/module.config.php';
  }

  public function getServiceConfig()
    {
    return [
        'factories' => [
            AlbumTable::class => function($container) {

                $tableGateway = $container->get(Model\AlbumTableGateway::class);
                return new AlbumTable($tableGateway);
            },
            Model\AlbumTableGateway::class => function ($container) {

                $dbAdapter = $container->get(AdapterInterface::class);

                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Album());
                return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
            },
            Model\LoginTable::class =>  function($container) {
            $tableGateway = $container->get(Model\LoginTableGateway::class);
            $table = new LoginTable($tableGateway);
            return $table;
           },
                    Model\LoginTableGateway::class => function ($container){
                     $dbAdapter = $container->get(AdapterInterface::class);
                     $resultSetPrototype = new ResultSet();
                     return new TableGateway('login', $dbAdapter, null, $resultSetPrototype);
                     }
           ],
            ];
}

 public function getControllerConfig()
{
    return [
        'factories' => [
            Controller\AlbumController::class => function($container) {
              return new Controller\AlbumController($container->get(Model\AlbumTable::class));
            },
            Controller\LoginController::class => function($container)  {
              return new Controller\LoginController($container->get(Model\LoginTable::class));
            },
            Controller\LogoutController::class => function($container){
              return new Controller\LogoutController($container->get(Model\LoginTable::class));
            },
         ],
    ];
}
}
类AlbumController扩展AbstractActionController { 受保护的角色; 公共函数onDispatch(\Zend\Mvc\MvcEvent$e) { $userSession=新容器(“用户”); 如果(!isset($userSession->email)){ 返回$this->redirect()->toRoute('login'); } 否则{ $this->role=$userSession->role; 母公司::onDispatch($e); } } 公共函数检查权限($role,$action) { 如果($role=='admin'){ $acl=新acl(); 如果($acl->isAllowed('admin','AlbumController',$action)){ 返回true; } } 返回false; } 公共职能编辑行动() { $action='edit'; $permission=$this->checkPermission($this->role,$action); 如果(!$permission){ $this->flashMessenger()->addMessage('您没有编辑的特权!!'); 返回$this->redirect()->toRoute('album'); } $id=(int)$this->params()->fromRoute('id',0); 如果(0==$id){ 返回$this->redirect()->toRoute('album',['action'=>'add']); } 试一试{ $album=$this->table->getAlbum($id); }捕获(\异常$e){ 返回$this->redirect()->toRoute('album',['action'=>'index']); } $form=newalbumForm(); $form->bind($album); $form->get('submit')->setAttribute('value','Edit'); $request=$this->getRequest(); $viewData=['id'=>$id,'form'=>$form]; 如果(!$request->isPost()){ 返回$viewData; } $form->setInputFilter($album->getInputFilter()); $form->setData($request->getPost()); $edit=$request->getPost('submit','Cancel'); 如果($edit=='Cancel'){ $this->flashMessenger()->addMessage('Cancelled by User…!!'); 返回$this->redirect()->toRoute('album'); } 如果(!$form->isValid()){ $this->flashMessenger()->addMessage('更新失败…!!'); 返回$viewData; }否则{ $this->table->saveAlbum($album); $this->flashMessenger()->addMessage('Record Updated Successfully…!!'); } //重定向到相册列表 返回$this->redirect()->toRoute('album',['action'=>'index']); } } 现在我想把onDispatch函数移到Module.php,但不知道如何实现它。有人能帮我吗

Module.php

class AlbumController extends AbstractActionController
{
protected $role;
public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $userSession = new Container('user');
    if (!isset($userSession->email)) {
        return $this->redirect()->toRoute('login');
    }
    else {
        $this->role = $userSession->role;
        parent::onDispatch($e);
      }
    }
public function checkPermission($role,$action)
{
  if($role == 'admin'){
    $acl = new Acl();
    if ($acl->isAllowed('admin', 'AlbumController', $action)) {
        return true;
    }
  }
  return false;
}
public function editAction()
{
  $action = 'edit';
  $permission = $this->checkPermission($this->role,$action);
  if (!$permission) {
      $this->flashMessenger()->addMessage('<div class="alert alert-  danger" role="alert"><b>You dont have the privilege to edit!!</b></div>');
      return $this->redirect()->toRoute('album');
  }
  $id = (int) $this->params()->fromRoute('id', 0);

    if (0 === $id) {
        return $this->redirect()->toRoute('album', ['action' => 'add']);
    }
    try {
        $album = $this->table->getAlbum($id);
    } catch (\Exception $e) {
        return $this->redirect()->toRoute('album', ['action' => 'index']);
    }

    $form = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request = $this->getRequest();
    $viewData = ['id' => $id, 'form' => $form];
    if (! $request->isPost()) {
        return $viewData;
    }

    $form->setInputFilter($album->getInputFilter());
    $form->setData($request->getPost());
    $edit = $request->getPost('submit', 'Cancel');
    if($edit == 'Cancel'){
      $this->flashMessenger()->addMessage('<div class="alert alert-danger" role="alert"><b>Cancelled by User...!!</b></div>');
      return $this->redirect()->toRoute('album');
    }
    if (! $form->isValid()) {
        $this->flashMessenger()->addMessage('<div class="alert alert-danger" role="alert"><b>Failed to Update...!!</b></div>');
        return $viewData;
    }else{
      $this->table->saveAlbum($album);
      $this->flashMessenger()->addMessage('<div class="alert alert-success" role="alert"><b>Record Updated Successfully...!!</b></div>');
    }
    // Redirect to album list
    return $this->redirect()->toRoute('album', ['action' => 'index']);
}
}
<?php
 namespace Album;

 use Album\Controller\AlbumController;
 use Album\Model\Album;
 use Album\Model\AlbumTable;
 use Zend\Db\Adapter\AdapterInterface;
 use Zend\Db\ResultSet\ResultSet;
 use Zend\Db\TableGateway\TableGateway;
 use Zend\ModuleManager\Feature\ConfigProviderInterface;
 use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
 use Album\Model\LoginTable;

 class Module implements ConfigProviderInterface
 {
  public function getConfig()
  {
     return include __DIR__ . '/../config/module.config.php';
  }

  public function getServiceConfig()
    {
    return [
        'factories' => [
            AlbumTable::class => function($container) {

                $tableGateway = $container->get(Model\AlbumTableGateway::class);
                return new AlbumTable($tableGateway);
            },
            Model\AlbumTableGateway::class => function ($container) {

                $dbAdapter = $container->get(AdapterInterface::class);

                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Album());
                return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
            },
            Model\LoginTable::class =>  function($container) {
            $tableGateway = $container->get(Model\LoginTableGateway::class);
            $table = new LoginTable($tableGateway);
            return $table;
           },
                    Model\LoginTableGateway::class => function ($container){
                     $dbAdapter = $container->get(AdapterInterface::class);
                     $resultSetPrototype = new ResultSet();
                     return new TableGateway('login', $dbAdapter, null, $resultSetPrototype);
                     }
           ],
            ];
}

 public function getControllerConfig()
{
    return [
        'factories' => [
            Controller\AlbumController::class => function($container) {
              return new Controller\AlbumController($container->get(Model\AlbumTable::class));
            },
            Controller\LoginController::class => function($container)  {
              return new Controller\LoginController($container->get(Model\LoginTable::class));
            },
            Controller\LogoutController::class => function($container){
              return new Controller\LogoutController($container->get(Model\LoginTable::class));
            },
         ],
    ];
}
}

我就是这样实现的。在
Module.php
中,在
事件调度
上添加一个侦听器,并使用闭包作为回调,该回调将调用中间件类授权:

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }

    public function onBootstrap(MvcEvent $e)
    {
        $app = $e->getApplication();
        $eventManager = $app->getEventManager();
        $serviceManager = $app->getServiceManager();

        // Register closure on event DISPATCH, call your checkProtectedRoutes() method
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, function (MvcEvent $e) use ($serviceManager) {
            $match = $e->getRouteMatch();
            $auth = $serviceManager->get(Middleware\AuthorizationMiddleware::class);
            $res = $auth->checkProtectedRoutes($match);
            if ($res instanceof Response) {
                return $res;
            }
        }, 1);

        // Init ACL : could be improved
        $this->initAcl($e);
    }
您应该有一个
授权中间件工厂
(可以随意调用):


它可以改进,但你有这个想法。。。另请参见此问题和答案:

我就是这样实现的。在
Module.php
中,在
事件调度
上添加一个侦听器,并使用闭包作为回调,该回调将调用中间件类授权:

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }

    public function onBootstrap(MvcEvent $e)
    {
        $app = $e->getApplication();
        $eventManager = $app->getEventManager();
        $serviceManager = $app->getServiceManager();

        // Register closure on event DISPATCH, call your checkProtectedRoutes() method
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, function (MvcEvent $e) use ($serviceManager) {
            $match = $e->getRouteMatch();
            $auth = $serviceManager->get(Middleware\AuthorizationMiddleware::class);
            $res = $auth->checkProtectedRoutes($match);
            if ($res instanceof Response) {
                return $res;
            }
        }, 1);

        // Init ACL : could be improved
        $this->initAcl($e);
    }
您应该有一个
授权中间件工厂
(可以随意调用):

它可以改进,但你有这个想法。。。另请参见此问题和答案:

更简单,使用此(免责声明,我是作者)更简单,使用此(免责声明,我是作者)