我正在构建一个基于Symfony2和Sylius的内部Web应用程序。我公司有4个不同的办公室,带有静态IP地址,我想跟踪用户在哪个办公室运营。一些员工在不同的日子搬到不同的地方,一些用户的笔记本电脑也在一天内从一个地方移动到另一个地方。几乎每个涉及写入数据库的页面视图都需要引用位置(应用程序需要知道事件发生的位置)。
我正在寻找有关如何最好地存储和参考此信息的建议。我将有一个静态的IP地址列表和他们对应的办公室。此列表可以存在于yml或数据库表中(我们预计每年一次添加位置,因此编辑此列表可以是手动任务)。这应该是我只是存储在一个会话中,或通过$ container-> get('request') - > getClientIp()在我的所有控制器中查找每个页面加载,或者创建一个Symfony2 ROLE并将其分配给用户登录时,还是?其他建议如何最好地完成这个?
我仍然对Symfony2很新,所以如果这种逻辑有明显的地方,我很抱歉......我认为它会有点独特,因为大多数面向公众的网络应用都不会,也许在很多情况下应该在这种情况下,我不需要跟踪我需要的方式......提前致谢。
答案 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>