我正在为我在另一个问题中描述的两个不同模块实现单独的auth解决方案。
Zend framework 2 : Add different authentication adapter for two different modules
现在在AuthListener文件中,如果身份验证失败,我会编写用于转发/调用其他控制器/操作的代码。那是
$result = $this->adapter->authenticate();
if (!$result->isValid()) {
$response = $event->getResponse();
// Set some response content
$response->setStatusCode(401);
$routeMatch = $event->getRouteMatch();
$routeMatch->setParam('controller', 'First\Controller\Error');
$routeMatch->setParam('action', 'Auth');
}
现在我收到404错误 - “请求的控制器无法发送请求”。首先,我认为我没有为Error / Auth添加路由,但后来我验证了所有其他控制器/操作也获得了404。所有都可以通过各自的路线直接访问。但转发导致404错误。一件重要的事情 - 我通过phpunit发送身份验证请求来制作单元测试用例。
更新:路线详情:
'routes' => array(
'rest' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
'options' => array(
'route' => '/rest[/:id]',
'constraints' => array(
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'First\Controller\Index'
),
),
),
'error' => array(
'type' => 'segment',
'options' => array(
'route' => '/rest-error/[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'First\Controller\Error',
'action' => 'auth',
),
),
)
),
'controllers' => array(
'invokables' => array(
'First\Controller\Auth' => 'First\Controller\AuthController',
'First\Controller\Error' => 'First\Controller\ErrorController'
),
),
Module.php
$listener = $serviceManager->get('First\Service\AuthListener');
$listener->setAdapter($serviceManager->get('Rest\Service\BasicAuthAdapter'));
$eventManager->getSharedManager()->attach('First', 'dispatch', $listener, 100);
我也尝试使用forward而不是上面的解决方案,但是这给了循环前进Circular forwarding detected: greater than 10 nested forwards
错误。我认为事件在前进时被称为。
答案 0 :(得分:0)
尝试像这样调用你的行动: $ routeMatch-> setParam(' action',' auth');
答案 1 :(得分:0)
我认为问题可能会发生,因为您正在倾听MvcEvent::EVENT_DISPATCH
。在您的监听器中,您为controller
设置了新的action
和RouteMatch
变量,但由于您已经通过了路由事件,因此更改这些参数将不会产生任何影响。
你应该听取MvcEvent::EVENT_ROUTE
,然后它可能会有用。