我安装ZFCUser
成功。 现在,我不知道是否有在全球范围内检查认证的方式。
正如概述在维基有几种方法来检查AUTH。 他们都工作,但我必须把退房如果从句真的每一个动作? 在beeing记录,如果没有,你应该重新路由到登录页面时,我所有的网站应该只有accessable。
有谁知道,如果有一个集中的地方,我可以把这个逻辑是什么?
我安装ZFCUser
成功。 现在,我不知道是否有在全球范围内检查认证的方式。
正如概述在维基有几种方法来检查AUTH。 他们都工作,但我必须把退房如果从句真的每一个动作? 在beeing记录,如果没有,你应该重新路由到登录页面时,我所有的网站应该只有accessable。
有谁知道,如果有一个集中的地方,我可以把这个逻辑是什么?
说实话,我不认为这是阻止每一个页面的未验证用户是个好主意。 你将如何访问登录页面?
这就是说,你必须知道要访问的页面,取消对匿名用户访问页面的白名单。 首先,我建议,包括登录页面。 您可以通过使用他们的路线最简单的检查页面。 因此,检查对白名单目前与之匹配的路由。 如果受阻,作用于。 否则,什么都不做。
一个例子是一个Module.php内从一个模块,例如您的应用程序:
namespace Application;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;
class Module
{
protected $whitelist = array('zfcuser/login');
public function onBootstrap($e)
{
$app = $e->getApplication();
$em = $app->getEventManager();
$sm = $app->getServiceManager();
$list = $this->whitelist;
$auth = $sm->get('zfcuser_auth_service');
$em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($list, $auth) {
$match = $e->getRouteMatch();
// No route match, this is a 404
if (!$match instanceof RouteMatch) {
return;
}
// Route is whitelisted
$name = $match->getMatchedRouteName();
if (in_array($name, $list)) {
return;
}
// User is authenticated
if ($auth->hasIdentity()) {
return;
}
// Redirect to the user login page, as an example
$router = $e->getRouter();
$url = $router->assemble(array(), array(
'name' => 'zfcuser/login'
));
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}, -100);
}
}
在ZF 2.4.2我这样做是Module.php
class module {
protected $whitelist = array(
'Application\Controller\Login'
);
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
// add event
$eventManager->attach('dispatch', array($this, 'checkLogin'));
}
public function checkLogin($e)
{
$auth = $e->getApplication()->getServiceManager()->get("Zend\Authentication\AuthenticationService");
$target = $e->getTarget();
$match = $e->getRouteMatch();
$controller = $match->getParam('controller');
if( !in_array($controller, $this->whitelist)){
if( !$auth->hasIdentity() ){
return $target->redirect()->toUrl('/login');
}
}
}
//other methods....
}
您可以使用ZF2模块BjyAuthorize阻止/允许访问的页面基于用户角色,如guest
, user
使用等controller guard
, route guard
等
人,
提示,不要忘了添加“用”来纠正RouteMatch声明:
use Zend\Mvc\Router\Http\RouteMatch;
这里需要这样的:
if (!$match instanceof RouteMatch)...
如果你忘了,如果上面有见异思迁
另一种选择可能是创建自己的抽象控制器超和实施这样的onDispatch()方法:
public function onDispatch(MvcEvent $e)
{
// check authentication here
return parent::onDispatch($e);
}
您可以在那里实现白名单太:)。