Мне нужно провести комплексный аудит в базе данных MySQL, к которой можно получить доступ с помощью приложения Symfony2.Как установить переменную сеанса MySQL при входе в систему Symfony2
Насколько я знаю, стандартная практика заключается в том, чтобы вставить в таблицу аудита значение, возвращаемое встроенной функцией 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 обрабатывает только регистрационную форму, а «сама система безопасности позаботится о проверке имени пользователя и пароля и аутентификации пользователя».
Итак, мой вопрос в том, где я могу вставить вышеуказанный код, чтобы он всегда выполнялся в начале сеанса после того, как пользователь успешно вошел в систему?
Большое спасибо.
Я считаю, что эти переменные сеанса имеют область подключения, которая закрывается точно после того, как вы прошли аутентификацию (или получили от нее ответ от этого вопроса). Вот почему я думаю, что переменная 'sf_user' не будет в следующий раз, когда вы выдадите запрос. Если вы не используете постоянное соединение ... –
Я думал, что сеанс базы данных длился до тех пор, пока сеанс Symfony, но если я правильно вас понимаю, приложение Symfony делает новое соединение каждый раз, когда ему нужно взаимодействовать с базой данных и закрывает его как только он будет закончен. –
Есть ли причины, по которым постоянное соединение - плохая идея, а если нет, как это установить? –