9

symfony 2.0 のセキュリティ システムのエンティティ プロバイダーとして、独自の User クラスを使用しています。

ページをリロードするたびに、symfony が db からユーザーを取得していることに気付きました:

t0.id を id1 として、t0.username を username2 として、t0.salt を salt3 として、t0.password を password4 として、t0.email を email5 として、t0.is_active を is_active6 として、t0.credentials を資格情報として 7 から w9_users t0 WHERE t0.id = ? パラメータ: ['23'] 時間: 4.43 ms

この動作を無効にする簡単な方法はありますか? セッション変数でユーザーデータをシリアル化するか、何らかの方法でキャッシュしますか?

4

1 に答える 1

11

refreshUserのメソッドでこの動作を変更できますUserProvider

doctrine でこれを行うときは注意が必要です: FosUserBundle githubに問題があり、落とし穴が説明されています:

セッションに保存すると、いくつかの問題が発生する可能性があるため、デフォルトでは保存されません。

管理者がユーザーの権限を変更した場合、その変更は次回データベースからユーザーを取得したときにのみ有効になります。そのため、セキュリティの問題を回避するために、ユーザーのキャッシュは慎重に行う必要があります

セッションでシリアル化されたユーザーを単純に再利用すると、Doctrine によって管理されなくなります。これは、ユーザーを変更したり、リレーションでユーザーを使用したりするとすぐに、それを UnitOfWork にマージし直す必要があることを意味します (これは、ファイアウォールで使用されるオブジェクトとは異なるオブジェクトを返します)。マージすると、DB クエリもトリガーされます。また、そのようなロジックを要求すると、ユーザー オブジェクトを更新に使用できることを期待している組み込みコントローラーの一部が機能しなくなります。

于 2012-04-08T19:26:28.427 に答える