在BjyAuthorize之前执行代码

时间:2014-11-16 22:29:43

标签: php zend-framework zend-framework2 bjyauthorize

我创建了一个“记住我”基于cookie的登录系统,我正在使用ZFc与ZfcUser和BjyAuthorize。 好吧,登录后,如果缓存过期,BjyAuthorize会在我的“记住我”系统之前触发,并且用户不会被识别为已登录。

这是我在AbstractController中调用“记住我”cookie系统的地方:https://gist.github.com/Gamempire/2b6b6388cedca9491d5f#file-abstractcontroller-php-L18(每个控制器扩展我的AbstractController)

我怎样才能在BjyAuthorize之前调用它,所以BjyAuthorize知道有人登录了?

由于

1 个答案:

答案 0 :(得分:1)

为了做到这一点,我不会在bjyAuthorize之前尝试注入自己 最好添加到ZfcUser功能并使用storageChain来获取用户的身份。

首先覆盖ZfcUser的服务名称

'service_manager' => array(
    'factories' => array(
        'zfcuser_auth_service' => 'myNamespace\Factory\AuthenticationServiceFactory',
    ),
),

在此之后你需要创建自己的工厂基本上你可以复制ZfcUser并改变它

public function createService(ServiceLocatorInterface $serviceLocator)
{
    $storageChain = new \Zend\Authentication\Storage\Chain();

    // dummy storage interface
    $nonPersistent = new \Zend\Authentication\Storage\NonPersistent(); // replace this with your own storage interface.
    $nonPersistent->write(1); // just to test 

    /* @var $authStorage Storage\StorageInterface */
    $authStorage = $serviceLocator->get('ZfcUser\Authentication\Storage\Db');

    $storageChain->add($authStorage, 10); // Check this interface first.
    $storageChain->add($nonPersistent, 0); // Check this interface Second.

    /* @var $authAdapter Adapter\AdapterInterface */
    $authAdapter = $serviceLocator->get('ZfcUser\Authentication\Adapter\AdapterChain');

    return new AuthenticationService(
        $storageChain,
        $authAdapter
    );
}

使用此示例代码,当用户没有登录会话时,执行$this->zfcUserAuthentication()->getIdentity()将返回1。

在此之后,您需要创建自己的存储界面。它实现了Zend \ Authentication \ Storage \ StorageInterface。我不知道你的cookie实现是如何的,你需要适应它。您还需要实现何时使用cookie以及何时不使用cookie。还有一个为zfcuser制作的模块,它实现了一个名为GoalioRememberMe的记住我的函数。我希望这会对你有所帮助。