Symfony2 アプリを使用してアクセスする MySQL データベースで包括的な監査を行う必要があります。
私の知る限り、標準的な方法は、組み込みの MySQL 関数 USER() によって返された値を監査テーブルに挿入して、誰がレコードを変更したかを記録することです。データベースへのすべての変更は、parameters.ini ファイルで指定されたデータベース接続パラメーターを使用して Symfony2 フロントエンドを介して実行されるため、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 がログイン フォームの表示のみを処理し、「セキュリティ システム自体が、送信されたユーザー名とパスワードのチェックとユーザーの認証を処理する」ことです。
それで、私の質問は、ユーザーが正常にログインした後、セッションの開始時に常に実行されるように、上記のコードをどこに挿入できますか?
どうもありがとう。