検索に権限を使う

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
  • クエリの _readaccess フィールドに追加の節を追加できるかどうか。

EnableReadAccessIndexing設定の値がtrueなら、これら両方とも真です。値がfalseなら、両方とも偽であり、このインデックスではパーミッションが使われません。

この機能はデフォルトでsitecore_master_indexインデックスでのみ有効化されています。

ウェブサイト検索の権限を使用するには:

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

インデックス戦略は、権限が有効な検索を使うとsecurityフィールドの変更をチェックします。

APIで検索する際は権限を使いましょう

インデックス戦略は、コンテンツ項目のsecurityフィールドの変化に反応し、セキュリティドメインの設定変更には反応しません。したがって、セキュリティドメインを変更する際には、権限付き検索を使うインデックスを再構築する必要があります。

!注権限付き検索をオンにする前にセキュリティ設定を完了することをお勧めします。システムへの新規ユーザー追加や役割割り当ては、アクセス権を直接割り当てない限りインデックス更新は必要ありません。

権限を考慮する検索クエリを作成するために、いくつかのヘルパーメソッドを使用できます。ヘルパーメソッドは以下のSitecore.ContentSearch.Security.QueryableExtensionsクラスに属します:

///

/// Filters the specified source based on "item
" access for user. ///
. /// The type of the source. /// The source. /// The user. /// The results. public static IQueryable WhereUserCanRead(this IQueryable source, User user) where T : IreadAccessSearchResult

///

/// Filters the specified source based on "item
" access for role. ///
. /// The type of the source. /// The source. /// The role. /// The results. public static IQueryable WhereRoleCanRead(this IQueryable source, Role role) where T : IReadAccessSearchResult

権限を考慮するクエリを作成するためにヘルパーメソッドを使う方法:

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

!注ヘルパーメソッドを使うシナリオは、単一のメソッド呼び出しを使うことです。メソッドパラメータをオーバーライドすることはできません。

メソッドコール(例: query.WhereUserCanRead(userA).WhereUserCanRead(userB))を連鎖すると、Sitecore両方のユーザーの検索結果をフィルタリングします。

IReadAccessSearchResultインターフェース

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

///

/// Interface for the search result that support index field. /// public interface IReadAccessSearchResult { /// /// Gets or sets field. /// IndexField(BuiltinFields.ReadAccess) IEnumerable ReadAccess { get; } }

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

組み込みの検索結果タイプ、例えばSearchResultItemやUISearchResultItemはこれらのインターフェースを実装し、Sitecore.ContentSearch.Security.QueryableExtensionsクラスの使用をサポートしています。

SearchSecurityOptionsプロパティ

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

public enum SearchSecurityOptions { ///

The default security options. Default = 0,

///

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

///

/// Runs a security check on all items. /// 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(); }

および

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

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

権限付き検索には複数の役割を持つユーザーにはいくつかの制限があります。詳細については、「 Permission-Enabled Search可能に不完全な検索結果を返すかもしれません」をご覧ください。

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