0

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

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

如何在 BjyAuthorize 之前调用它,让 BjyAuthorize 知道有人登录?

谢谢

4

1 回答 1

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()当没有 Session 登录用户时,doing 将返回 1。

在此之后,您将需要创建自己的存储接口。它实现了 Zend\Authentication\Storage\StorageInterface。我不知道您的 cookie 实现如何,您需要对其进行调整。您还需要实施何时使用 cookie 以及何时不使用。还有一个为 zfcuser 制作的模块,它实现了一个名为GoalioRememberMe的记住我的函数。我希望这可以帮助你。

于 2014-11-22T20:20:42.757 回答