我想知道如何在整个模块中执行访问控制。让我解释一下:如果我有一个模块(/ authentication /),它只是为了创建会话而开发的。另一个模块(/ Main /)包含主应用程序。
我想要做的是检查主模块上的任何请求,如果用户正确创建了会话。
在我对互联网的研究中,我看到了一种方法。我不确定,所以告诉我我的解决方案是否合适:我将在我的引导函数(在module.php上)实现一个事件,它将检查会话是否正确创建。如果不是,我将重定向到模块身份验证。
public function onBootstrap($e){
$eventManager = $e->getApplication()->getEventManager();
$auth = new AuthenticationService();
if (!$auth->hasIdentity()) {
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', 'authentification');
$response->setStatusCode(302);
}
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
}
您对此解决方案有何看法?
不幸的是,这个解决方案并不好。 我不知道为什么,但似乎即使在模块身份验证中也会执行此代码。 因此,在第一次调用时,当您尝试进入url:/ main时,您将重定向到模块/身份验证,然后代码将重新执行,模块将重定向到/身份验证,并且一次又一次再次...
所以我认为解决方案是检查请求的URL是否与此/身份验证不同。
怎么做?
希望我的问题清晰明白,易于理解。
谢谢= D
答案 0 :(得分:2)
public function onBootstrap(MvcEvent $e) {
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function($e) {
$controller = $e->getTarget();
$auth = new AuthenticationService();
$is_login = $auth->hasIdentity();
//check if action is login
$params = $e->getApplication()->getMvcEvent()->getRouteMatch()->getParams();
if ($params['action'] == 'login') {
if ($is_login) {
return $controller->redirect()->toRoute('adminindex');
}
} else {
if (!$is_login) {
return $controller->redirect()->toRoute('adminauthlogin');
}
}
});
}
更好的解决方案;)