0

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 がログイン フォームの表示のみを処理し、「セキュリティ システム自体が、送信されたユーザー名とパスワードのチェックとユーザーの認証を処理する」ことです。

それで、私の質問は、ユーザーが正常にログインした後、セッションの開始時に常に実行されるように、上記のコードをどこに挿入できますか?

どうもありがとう。

4

2 に答える 2

0

kernel.requestイベント リスナーを作成し、そこでクエリを実行できます。それに加えて、現在の作成者名を自動的に挿入するEntityAuditバンドルを見ることができます。ただし、いくつかの制限があります。

于 2012-05-24T09:38:13.580 に答える
0

すべての提案に感謝します。各 deleteAction コントローラーで変数 @sf_user の設定に戻りました。きれいではありませんが、機能します。

于 2012-05-28T11:08:31.190 に答える