繁体   English   中英

如何在Symfony2登录时设置MySQL会话变量

[英]How to set MySQL session variable upon Symfony2 login

我需要对将使用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仅处理显示登录表单,而“安全系统本身负责检查提交的用户名和密码并验证用户身份”。

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

非常感谢。

您可以创建一个kernel.request事件侦听器并在那里执行查询。 除此之外,您还可以查看EntityAudit捆绑包,该捆绑包会自动插入当前作者姓名。 但是它有一些限制

感谢所有建议,我刚刚回到每个deleteAction控制器中设置变量@sf_user。 它不漂亮,但是可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM