2012-05-24 49 views
0

我需要对使用Symfony2应用程序访问的MySQL数据库执行一些全面的审计。如何在Symfony2登录时设置MySQL会话变量

据我所知,标准做法是将内置MySQL函数USER()返回的值插入到审计表中,以记录正在对记录进行更改的人员。由于对数据库的所有更改都将通过Symfony2前端执行,并且在parameters.ini文件中指定了数据库连接参数,所以USER()将始终返回相同的值。为了解决这个问题,我使用了一个MySQL会话变量@sf_user。我可以从Symfony会话对象中获取用户名,并使用它在我的控制器中设置@sf_user的值,例如

$em = $this->getDoctrine()->getEntityManager(); 
// set @sf_user session variable in the database 
// so trigger can insert this in audit table after delete 
$conn = $em->getConnection(); 
$username = $this->get('security.context')->getToken()->getUser()->getUsername(); 
$sql = 'SET @sf_user = \''.$username.'\''; 
$stmt = $conn->prepare($sql); 
$stmt->execute(); 

这是好的,但因为我审计所有表格和无法预测用户将首先执行该行动,我需要在每一个控制器,以确保@sf_user重复此代码设置在会议开始。

我真正想做的是在用户登录时设置此变量。我已经按照The Book中所述设置了我的登录页面。问题是,我的SecurityController只处理显示登录表单,而“安全系统本身负责检查提交的用户名和密码并验证用户”。

所以,我的问题是,我可以在哪里插入上面的代码,以便在用户成功登录后始终在会话开始时执行它?

很多谢谢。

+0

我相信这些会话变量的连接范围在您通过身份验证后(或已收到控制器的任何响应)完全关闭。这就是为什么我认为下一次发出查询时'sf_user'变量不会出现在那里的原因。 除非您使用持续连接... –

+0

我认为数据库会话持续的时间与Symfony会话持续时间一样长,但如果我理解正确,Symfony应用程序会在每次需要与数据库交互并关闭它时创建一个新连接只要它完成了。 –

+0

是否有持久连接是一个坏主意的原因,如果不是,我该如何设置? –

回答

0

感谢您的所有建议,我刚刚回去在每个deleteAction控制器中设置变量@sf_user。这并不漂亮,但它的工作原理。

0

您可以创建kernel.request事件侦听器并在那里执行您的查询。除此之外,你可以看看自动插入当前作者姓名的EntityAudit包。但它有一些limitations

+0

感谢您的建议。其中之一或两者都可能解决我的问题,但要求我深入研究Symfony的内部工作,而不是现在有空。但是,一定要记住以备将来参考。 –