---
title: "検索に権限を使う"
slug: "use-permissions-for-search"
abstract: "ユーザーが読む権限を持つ項目のみを取得するようにコンテンツ検索を設定してください。"
---
# 検索に権限を使う

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なら、これら両方とも真です。値がfalseなら、両方とも偽であり、このインデックスではパーミッションが使われません。

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

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

-   sitecore\_web\_indexのenableReadAccessIndexing設定の値を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インターフェースの実装。

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

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

### IReadAccessSearchResultインターフェース

IReadAccessSearchResultインターフェースを使って、検索クエリの結果を\_readaccessフィールドの値に基づいてフィルタリングする必要があると指定します。ReadAccessという単一のプロパティがあります。このプロパティは\_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インターフェースを実装する必要があります。

組み込みの検索結果タイプ、例えばSearchResultItemやUISearchResultItemはこれらのインターフェースを実装し、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);
}

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

権限付き検索には複数の役割を持つユーザーにはいくつかの制限があります。詳細については、「 [Permission-Enabled Search可能に不完全な検索結果を返すかもしれません](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1002927)」をご覧ください。