検索の権限を使用する

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

Sitecoreコンテンツ検索を設定して、検索を実行するユーザーが読み取り権限を持っているアイテムのみを取得して表示することができます (パーミッションが有効な検索)。この機能は、Sitecoreクライアントで検索し、検索APIを使用してコードで検索クエリを作成するときに使用できます。

デフォルトでは、この機能はSitecoreクライアント (Sitecore UI) とsitecore_master_indexインデックスに対してのみ有効になっていますが、これは設定で変更できます。

アクセス許可が有効な検索を構成する

コンテンツ検索設定には、_readaccessという計算フィールドがあります。例えば、Solr検索プロバイダーの場合、このフィールドはSitecore/ContentSearch/ Sitecore.ContentSearch.Solr.DefaultIndexConfiguration.configファイルのcontentSearch/indexConfigurations/defaultSolrIndexConfiguration/documentOptionsノードにあります。

インデックス構成のEnableReadAccessIndexing設定では、次の2つのことを指定します。

  • Sitecoreがインデックスのsecurityフィールドにitem:readアクセス権を保存するかどうか。

  • _readaccessフィールドの句をクエリに追加できるかどうか。

EnableReadAccessIndexing設定の値がtrueの場合、これらのことは両方ともtrueです。値がfalseの場合、どちらもfalseであり、このインデックスでの検索にパーミッションは使用されません。

この機能は、デフォルトではsitecore_master_indexインデックスに対してのみ有効になっています。

Webサイトの検索にアクセス許可を使用するには:

  • sitecore_web_indexenableReadAccessIndexing設定の値をtrueに変更します。

インデックス作成戦略では、権限が有効な検索を使用すると、securityフィールドの変更がチェックされます。

APIから検索するときにアクセス許可を使用する

インデックス作成方法は、セキュリティ・ドメイン構成の変更ではなく、コンテンツ・アイテムのsecurityフィールドの変更に対応します。したがって、セキュリティ・ドメインを変更する場合は、権限が有効な検索を使用するインデックスを再構築する必要があります。

メモ

アクセス許可が有効な検索を有効にする前に、セキュリティ構成を完了することをお勧めします。新しいユーザーをシステムに追加したり、ユーザーをロールに割り当てたりする場合は、アクセス権をユーザーに直接割り当てない限り、インデックスを更新する必要はありません。

いくつかのヘルパー メソッドを使用して、アクセス許可を考慮した検索クエリを作成できます。ヘルパーメソッドは、Sitecore.ContentSearch.Security.QueryableExtensionsクラスにあります。

/// <summary>
/// Filters the specified source based on "item:read" access for user.
/// </summary>.
/// <typeparam name="T">The type of the source.</typeparam>
/// <param name="source">The source.</param>
/// <param name="user">The user.</param>
/// <returns>The results.</returns>
public static IQueryable<T> WhereUserCanRead<T>(this IQueryable<T> source, User user) where T : IreadAccessSearchResult

/// <summary>
/// Filters the specified source based on "item:read" access for role.
/// </summary>.
/// <typeparam name="T">The type of the source.</typeparam>
/// <param name="source">The source.</param>
/// <param name="role">The role.</param>
/// <returns>The results.</returns>
public static IQueryable<T> WhereRoleCanRead<T>(this IQueryable<T> source, Role role) where T : IReadAccessSearchResult

ヘルパーメソッドを使用して、アクセス許可を考慮したクエリを作成するには、次のようにします。

  • IReadAccessSearchResultインターフェイスの実装。

手記

ヘルパー メソッドを使用するシナリオは、1つのメソッド呼び出しを使用することです。methodパラメーターをオーバーライドすることはできません。

メソッド呼び出しをチェーンする場合 (例: query.WhereUserCanRead(userA).WhereUserCanRead(userB))、Sitecoreは両方のユーザーの検索結果をフィルタリングします。

IReadAccessSearchResultインターフェイス

IReadAccessSearchResultインターフェイスを使用して、検索クエリ結果を _readaccessフィールドの値に基づいてフィルタリングする必要があることを指定します。これには、ReadAccessという1つのプロパティがあります。このプロパティは、_readaccessインデックスフィールドと一致します。

/// <summary>
/// Interface for the search result that support <see cref="BuiltinFields.ReadAccess"/> index field.
/// </summary>
public interface IReadAccessSearchResult
{
    /// <summary>
    /// Gets or sets <see cref="BuiltinFields.ReadAccess"/> field.
    /// </summary>
    [IndexField(BuiltinFields.ReadAccess)]
    IEnumerable<string> ReadAccess { get; }
}

カスタム検索結果の種類を使用し、ヘルパー メソッドが必要な場合は、カスタムの種類にIReadAccessSearchResultインターフェイスを実装する必要があります。

組み込みの検索結果タイプ ( SearchResultItemUISearchResultItemなど) は、これらのインターフェイスを実装し、Sitecore.ContentSearch.Security.QueryableExtensionsクラスを使用してサポートします。

SearchSecurityOptionsプロパティ

APIを使用して検索クエリを作成する場合は、SearchSecurityOptionsプロパティを使用します。

public enum SearchSecurityOptions
{
    /// <summary>The default security options.</summary>
    Default = 0,

    /// <summary>
    /// Disables all security checks. 
    /// </summary>
    DisableSecurityCheck = 1 << 0,

    /// <summary>
    /// Runs a security check on all items.
    /// </summary>
    EnableSecurityCheck = 1 << 1,
}

SearchSecurityOptionsプロパティの値をEnableSecurityCheckに設定すると、Sitecoreはクライアント アプリケーションまたはAPIによって構築されたクエリに .WhereUserCanRead(Context.User) 拡張メソッドを自動的に適用します。つまり、次の2つのコード サンプルも同じことを行います。

var index = ContentSearchManager.GetIndex("sitecore_master_index");
using (var context = index.CreateSearchContext(SearchSecurityOptions.EnableSecurityCheck))
{
    var query = context.GetQueryable<SearchResultItem>();
}

そして

var index = ContentSearchManager.GetIndex("sitecore_master_index");
using (var context = index.CreateSearchContext())
{
    var user = Context.User;
    var query = context.GetQueryable<SearchResultItem>().WhereUserCanRead(user);
}

検索制限のオーバーライド

権限が有効な検索には、複数のロールを持つユーザーに対していくつかの制限があります。詳細については、「 アクセス許可が有効な検索で不完全な検索結果が返される可能性がある」を参照してください。

この記事を改善するための提案がある場合は、 お知らせください!