events - Zend framework 2: agregue un adaptador de autenticación diferente para dos módulos diferentes
authentication routing (1)
Hay una buena manera de hacer bootstrap específico del módulo: para usar SharedManager
:
$e->getApplication()->getEventManager()->getSharedManager()
->attach(__NAMESPACE__, ''dispatch'', function(MvcEvent $e) {
// This code will be executed for all controllers in current __NAMESPACE__
}, 100);
Aquí hay un buen artículo para entender la diferencia entre EventManager
y SharedEventManager
No hay información adicional sobre los oyentes en la pregunta, pero trato de adivinar:
- Si usas como oyente una clase
callable
, está bien, simplemente reemplaza lafunction() { }
por tu$listener
. - Si utiliza como clase de escucha, que implementa
ListenerAggregateInterface
, debe convertir oyentes enSharedListenerAggregateInterface
y usar el métodoattachAggregate
lugar deattach
¡Espero que ayude!
Tengo dos módulos diferentes. Ahora necesito agregar un mecanismo de autenticación diferente para ambos módulos.
Así que agregué el código del evento del primer módulo Module.php en el método Bootstrap
$listener = $serviceManager->get(''First/Service/AuthListener'');
$listener->setAdapter($serviceManager->get(''First/Service/BasicAuthAdapter''));
$eventManager->attach(MvcEvent::EVENT_ROUTE, $listener, 0);
y en el método de Bootstrap de Module.php del segundo módulo
$listener = $serviceManager->get(''Second/Service/AuthListener'');
$listener->setAdapter($serviceManager->get(''Second/Service/AdvAuthAdapter''));
$eventManager->attach(MvcEvent::EVENT_ROUTE, $listener, 0);
Ahora si desactivo uno de los módulos, la funcionalidad funciona bien y se solicita correctamente autenticada. Al habilitar ambos módulos, se superpone de algún modo, de modo que incluso el módulo requerido se autentica correctamente, pero el otro código de evento del módulo también se ejecuta y el sistema da un error no autenticado.
Estoy pensando que esto debido al código del controlador de eventos en ambos module.php se ejecuta sin tener en cuenta el URL del módulo solicitado.
Puedo verificar con el patrón de ruta solicitado antes de la autenticación, pero eso parece un truco en lugar de una buena solución.
Si existe una mejor solución para manejar este problema?
ACTUALIZACIÓN: Mi código de AuthListener:
namespace First/Service;
use Zend/Authentication/Adapter/AdapterInterface;
use Zend/Mvc/MvcEvent;
class AuthListener
{
protected $adapter;
public function setAdapter(AdapterInterface $adapter)
{
$this->adapter = $adapter;
}
public function __invoke(MvcEvent $event)
{
$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'');
}
}
}