如何跟踪内部symfony2应用程序的用户位置?

时间:2014-03-04 19:37:57

标签: php symfony sylius

我正在构建一个基于Symfony2和Sylius的内部Web应用程序。我公司有4个不同的办公室,带有静态IP地址,我想跟踪用户在哪个办公室运营。一些员工在不同的日子搬到不同的地方,一些用户的笔记本电脑也在一天内从一个地方移动到另一个地方。几乎每个涉及写入数据库的页面视图都需要引用位置(应用程序需要知道事件发生的位置)。

我正在寻找有关如何最好地存储和参考此信息的建议。我将有一个静态的IP地址列表和他们对应的办公室。此列表可以存在于yml或数据库表中(我们预计每年一次添加位置,因此编辑此列表可以是手动任务)。这应该是我只是存储在一个会话中,或通过$ container-> get('request') - > getClientIp()在我的所有控制器中查找每个页面加载,或者创建一个Symfony2 ROLE并将其分配给用户登录时,还是?其他建议如何最好地完成这个?

我仍然对Symfony2很新,所以如果这种逻辑有明显的地方,我很抱歉......我认为它会有点独特,因为大多数面向公众的网络应用都不会,也许在很多情况下应该在这种情况下,我不需要跟踪我需要的方式......提前致谢。

1 个答案:

答案 0 :(得分:0)

您不必修改控制器,只需创建event listener,并在每次请求时执行您想要执行的操作。

要获取用户,只需注入安全上下文服务并获取令牌。然后,如果请求位于防火墙后面,您可以获取用户。

以下是基于官方文档的示例(未经过测试,必须进行修改以适合您的项目):

// src/Acme/DemoBundle/EventListener/AcmeRequestListener.php
namespace Acme\DemoBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\Security\Core\SecurityContextInterface;

class AcmeRequestListener
{
    protected $sc;

    public function __construct(SecurityContextInterface $sc)
    {
        $this->sc = $sc;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            // don't do anything if it's not the master request
            return;
        }

        if( null === ($token = $this->sc->getToken()) ) {
            // don't do anything if you are not behind a firewall
            return;
        }

        // do anything with $token to get the user and check he is authenticated
        $user = $token->getUser();

        // Client IP
        $ip = $event->getRequest()->getClientIp();
    }
}

您的服务定义:

<!-- app/config/config.xml -->
<service id="kernel.listener.your_listener_name" class="Acme\DemoBundle\EventListener\AcmeExceptionListener">
    <argument type="service" id="security.context" />
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
</service>