私はMongoDBに大きなレコードセット/ドキュメントを持っており、各ドキュメントのリストにある値の組み合わせによってアイテムへのアクセスを制限する必要があります。値の組み合わせに基づくセキュリティハッシュキー
セキュリティの可能な値は[1、2、3]であるとします。
レコードはこれらの任意の組み合わせを持つことができます。 (1、)(2、)(1,3)(2,3) 2,3)
- [1]のみ(持つレコードを参照することができるであろうへのアクセス権を持つユーザ)&(1)
- [2]へのアクセス権を持つユーザは、あろう[1、2]にアクセスできるユーザーは、(1)、(2)、(3)、(4)を持つレコードのみを表示できます。 、(1,2)
- 私は、ユーザーのアクセスは、例えば、あるものを知っているデータベースへのエントリポイントですべてのレコード今
を見ることができるだろう[3、1、2]にアクセスできるユーザーのみ[1 、2,3]。しかし、私は簡単に(特に索引付けされた)レコードを調べて、ユーザーがアクセスできるすべての値を検索することはできません。各レコードの一意のハッシュを作成する機能を作成する
は、非常に簡単になります:
def hash_combination(input):
return hash(frozenset(input))
これはどの我々は、フィルタとしてのインデックスの使用をすることができ、私のレコードごとに一意のキーを与えるだろう。
from itertools import chain, combinations
def powerset(iterable):
"powerset([1,2,3]) -->() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))
def hash_powerset(iterable):
return [hash(frozenset(x)) for x in powerset(iterable)]
しかし、組み合わせの可能なユニークな入力の実際のリストがあることがあまりにも大きい要因を作成し、(50+)非常に大きくなることができますし、ユーザーのために可能なすべてのキーを取得することは、あまりにも簡単です。実用的。
2つの解決策しか考えられません。 1行目は行ごとのチェックです:
security_list = (1, 2, 3)
for row in db.collection.find():
# check security
if any(x not in security_list for x in row['row_security']):
continue
# security passed
pass
しかし、それは非常にパフォーマンスのキラーです。もう一つは、「私たちが見ることができない」に選択を反転させることである。
unique_list = (1, 2, 3, 4, 5)
security_list = (1, 2, 3)
not_allowed_list = (x for x in unique_list if x not in security_list)
for row in db.collection.find({'row_security': {'$nin': not_allowed_list}}):
# security passed
pass
しかし、これもそう、それはMongoDBは(おそらく理由は、私が今直面していたものと同様の理由の)インデックスできない操作ですまだパフォーマンスには向いていません。我々の場合のためのいくつかの詳細前のオプション(あなたがボトルネックとしてPythonオブジェクトへの変換を避けるよう)よりも良いが、それでもない偉大
:
- 我々は常にユーザー のセキュリティリストを知っています
- 我々は常に可能な値のユニークなリストを知っている(これは大きな可能)
- のpython 2.7、MongoDBの3.0
が他の方法はありますか?これに接近する最善の方法は何でしょうか?
敬具、
Carst
これは* Code Review *(http://codereview.stackexchange.com/)のための良い質問のように見えます。 –
正直言って、私はどちらが一番良いかを選択することが時々難しいです。しかし、私は、特定のプログラミング問題のstackoverflowを指しているhttp://meta.stackexchange.com/questions/129598/which-computer-science-programming-stack-exchange-do-i-post-inに基づいています。ソフトウェアアルゴリズム「 – Carst
私は[__acl__](https://stackoverflow.com/questions/tagged/acl+mongodb)があなたが発明しているシステムの適切な名前だと思います。 – robyschek