13

Symfony ACL を使用すると、エンティティへのアクセスを許可し、それを確認できます。

if (false === $securityContext->isGranted('EDIT', $comment)) {
    throw new AccessDeniedException();
}

ただし、データベースに何千ものエンティティがあり、ユーザーがそのうちの 10 個しかアクセスできない場合、すべてのエンティティをメモリにロードしてハイドレートしたくありません。

ユーザーが (SQL レベルで) アクセスできるエンティティのみをフィルタリングしながら、単純な "SELECT * FROM X" を実行するにはどうすればよいですか?

4

3 に答える 3

3

そうですね、それは不可能です。

昨年、私は、データベース クエリで直接フィルタリングできる代替 ACL システムに取り組んできました。

私の会社は最近、それをオープンソースにすることに同意したので、ここにあります: http://myclabs.github.io/ACL/

于 2014-04-23T14:13:29.883 に答える
1

前の議論で @gregor が指摘したように、

最初のクエリで、ユーザーがアクセスできるすべての object_identity_ids (特定のエンティティ/クラス X の) のリストを (カスタム クエリで) 取得します。

次に、エンティティ/クラス X のオブジェクトのリストをクエリするときに、クエリに「IN (object_identity_ids)」を追加します

Matthieu さん、私はこれ以上の推測で返答しても満足しませんでした (私の推測は会話に価値のあるものを何も加えていないからです)。そこで、このアプローチ(Digital Ocean 5$/mo VPS)についてベンチマークを行いました。

基準

予想どおり、IN 配列アプローチを使用する場合、テーブル サイズは問題になりません。しかし、配列のサイズが大きいと、制御不能になります。

だから、Join approachIN array approach

配列のサイズが巨大な場合、JOIN は確かに優れています。ただし、これは、テーブル サイズを考慮しないことを前提としています。実際には、オブジェクトの大きなテーブルがあり、acl エントリがほぼすべてのオブジェクトをカバーしている場合を除いて、IN 配列の方が高速です (リンクされた質問を参照 )

別の質問で私の推論を拡張しました。Symfony の ACL を使用する場合、JOIN クエリまたは IN 配列クエリを使用する方が良いですか? を参照してください。

于 2016-07-17T22:38:09.337 に答える