Ron*_*Ron 13 php authentication zend-framework2 zfcuser
我ZFCUser成功安装了.现在我想知道是否有办法全局检查身份验证.
如维基中所述,有几种方法可以检查身份验证.它们都有效,但是我必须在每一个动作中都使用check-if-clause 吗?我的所有网站都只能在登录时访问,如果没有,您应该被重新路由到登录页面.
有谁知道我是否可以把这个逻辑放在一个中心位置?
Jur*_*man 25
说实话,我认为阻止未经身份验证的用户的每个页面都不是一个好主意.您将如何访问登录页面?
也就是说,您必须知道正在访问的页面,以便为匿名访问者提供可访问的页面白名单.首先,我建议包括登录页面.您可以使用他们的路线检查最简单的页面.因此,请检查当前匹配的路由与白名单.如果被阻止,请采取行动.否则,什么也不做.
一个例子是来自模块的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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18154 次 |
| 最近记录: |