ZF2将Zend \ AuthenticationService设置为使用基于URL或模块的第二个会话或cookie

时间:2016-09-29 14:00:03

标签: zend-framework2 session-cookies zend-session

我已经设置了两个用户帐户模块 - 管理员和客户。我目前的设置意味着如果您登录管理员我的应用程序认为您还以客户身份登录。我决定的解决方案是创建一个会话,其中cookie路径基于管理员URL,即将cookie_path设置为/administrator

我的管理员Module.php onBootstrap功能包括:

$sessionConfig = new SessionConfig();
$sessionConfig->setOptions(['cookie_path' => '/administrator']);
$sessionManager = new SessionManager($sessionConfig, null, null);
Container::setDefaultManager($sessionManager);

设置cookie路径,但这会影响整个应用程序;即网站的其余部分不含cookie,因为网址不以/administrator开头。

如何设置我的应用程序,以便我的管理员模块的cookie_path与应用程序的其余部分不同?

[编辑]

我所追求的是两个cookie - 一个用于管理路径,一个用于应用程序的其余部分。

[编辑]

我正在使用Zend\Authentication\AuthenticationService进行ACL。我想要实现的是让用户登录网站的客户部分并进行操作,然后登录管理面板进行操作。

例如,Magento在处理客户帐户登录时会设置一个cookie,然后在处理管理员帐户登录时设置另一个cookie。

如何根据网址/模块设置Zend\Authentication\AuthenticationService使用第二个会话或Cookie?

1 个答案:

答案 0 :(得分:0)

要在身份验证服务上设置新命名空间,请执行以下操作:

$auth = $e->getApplication()->getServiceManager()->get('Zend\Authentication\AuthenticationService');
$auth->setStorage(new \Zend\Authentication\Storage\Session($_namespace));

在我的问题中,我想为我的管理区创建一个完全不同的会话。在我的抽象控制器中(我在我的acl设置中检查$auth详细信息)我有:

$params = $e->getRouteMatch()->getParams();

/** @var \Zend\Authentication\AuthenticationService */
$auth = $e->getApplication()->getServiceManager()->get('Zend\Authentication\AuthenticationService');
$_namespace = current(explode('\\', $params['__NAMESPACE__']));
// Most generic session namespace.
if(in_array($_namespace, ['Customer', 'Application', null])) {
    $_namespace = 'Zend_Auth';
}
$auth->setStorage(new \Zend\Authentication\Storage\Session($_namespace));

这不会创建第二个cookie,但它确实意味着我可以转到domain.dev/account(客户部分)并能够独立于domain.dev/administrator(管理部分)登录,这最终是我的试图这样做。