0

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

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

我对 Symfony2 还是很陌生,所以如果这种逻辑有一个明显的地方,我很抱歉......我认为它会有点独特,因为大多数面向公众的 web 应用程序不会,也许在很多情况下不应该跟踪 IP解决我在这种情况下需要的方式......提前致谢。

4

1 回答 1

0

您不必修改控制器,只需创建一个事件侦听器,然后在每个请求上执行您想要执行的操作。

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

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

// 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>
于 2014-03-05T09:03:29.343 回答