2012-05-24 2 views
0

Мне нужно провести комплексный аудит в базе данных 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 обрабатывает только регистрационную форму, а «сама система безопасности позаботится о проверке имени пользователя и пароля и аутентификации пользователя».

Итак, мой вопрос в том, где я могу вставить вышеуказанный код, чтобы он всегда выполнялся в начале сеанса после того, как пользователь успешно вошел в систему?

Большое спасибо.

+0

Я считаю, что эти переменные сеанса имеют область подключения, которая закрывается точно после того, как вы прошли аутентификацию (или получили от нее ответ от этого вопроса). Вот почему я думаю, что переменная 'sf_user' не будет в следующий раз, когда вы выдадите запрос. Если вы не используете постоянное соединение ... –

+0

Я думал, что сеанс базы данных длился до тех пор, пока сеанс Symfony, но если я правильно вас понимаю, приложение Symfony делает новое соединение каждый раз, когда ему нужно взаимодействовать с базой данных и закрывает его как только он будет закончен. –

+0

Есть ли причины, по которым постоянное соединение - плохая идея, а если нет, как это установить? –

ответ

0

Спасибо за все предложения, я только что вернулся к настройке переменной @sf_user в каждом контроллере deleteAction. Это некрасиво, но это работает.

0

Вы можете создать прослушиватель событий kernel.request и выполнить свой запрос там. Кроме того, вы можете взглянуть на комплект EntityAudit, который автоматически вставляет имя текущего автора. У него есть limitations.

+0

Спасибо за ваши предложения. Либо, либо оба могут решить мою проблему, но потребуют, чтобы я углубился во внутреннюю работу Symfony, чем сейчас. Однако, конечно, помните о будущей ссылке. –

Смежные вопросы