2017-01-25 11 views
1

複数のコンテンツをサイト全体で検索するために使用したインデックスは非常に広いです。管理者だけが検索できる新しいフィールドを追加したいと思います。通常のユーザーは検索できません。フィールドを条件付きで検索/除外する

現在のところ、検索フィールドをブラックリストに登録する唯一の方法は、SearchParamaters.SearchFieldsを使用することですが、これは他のすべてのフィールドを1つリストにする必要があります。これは理想的ではなく、インデックスが時折増加するためこのリスト。

また、リフレクションを使用してこのリストを作成することもできます。これが唯一の選択肢であれば、このルートに進むことができます。私が見落としていたもう一つの選択肢があることを願っていました。

+0

通常、セキュリティトリミングはドキュメントに適用され、フィールドには適用されません。シナリオについてもっと分かち合うことができますか?特に、検索応答にそのようなフィールドが存在しないのではなく、特定のフィールドでの一致を防ぐ必要があるのはなぜですか? –

+0

ユーザードキュメントがありますが、そのドキュメントには取得できない機密データが含まれている可能性がありますが、管理者は機密データを使用してルックアップを行うことができます。たとえば、電子メールアドレス。 –

+0

フィールドは取得できないため、データが漏洩するリスクはありません。最悪の場合、ユーザーは検索ヒットを取得し、その理由を理解しない可能性があります。 searchFieldsを使用する以外に、これに対処するもう1つの方法は、すべての機密フィールドを含むadmin検索用の2番目のインデックスを作成することです。各ドキュメントには、エンドユーザーに表示されるドキュメントのIDへの参照が戻されます。 –

答えて

0

現在、検索から除外するフィールドのリストを指定する方法はありません。優先度を高めるうえで、機能リクエストとしてUser Voiceに追加してください。

+0

ありがとう、ブルース。私は実行可能な解決策を思いついた。私の解決策が気に入らないのは、各公開/管理検索可能フィールドを明示的に定義する必要があることだけです。しかし、それは仕事を完了し、私たちは同じインデックスを使用することができます。 –

1

、これは理想的ではありませんが、私は[Searchable][AdminSearchable]属性を作成することになった、とGoogleの検索ドキュメントクラスのすべてのプロパティにこれらの装飾:

[Searchable] 
public string UserName { get; set; } 

[Searchable] 
public string UserDisplay { get; set; } 

[AdminSearchable] 
public string UserEmail { get; set; } 

し、リストを構築するためにこれらのstaticフィールドを使用現在のユーザーが管理者であるかどうかに基づいて、検索フィールド、の:

private static readonly string[] _PublicSearchFeilds = 
    typeof(SearchDocument).GetProperties() 
    .Where(p => System.Attribute.IsDefined(p, typeof(SearchableAttribute))) 
    .Select(p => p.Name.ToLowerCamelCase()).ToArray(); 

private static readonly string[] _AdminSearchFeilds = 
    typeof(SearchDocument).GetProperties() 
    .Where(p => 
     System.Attribute.IsDefined(p, typeof(SearchableAttribute)) || 
     System.Attribute.IsDefined(p, typeof(AdminSearchableAttribute))) 
    .Select(p => p.Name.ToLowerCamelCase()).ToArray(); 

そしてSearchParameters.SearchFieldsにこれを渡されました。

関連する問題