0

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

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

非常感谢。

4

2 回答 2

0

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

于 2012-05-24T09:38:13.580 回答
0

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

于 2012-05-28T11:08:31.190 回答