2021/04/27

Salesforceでwith sharingを使おう!関連するキーワードの使い方も解説

 
  

Salesforceのwith sharingの概要

with sharingとは、Salesforceで使われるApexという言語で、クラスを作成する際に、共有ルールの適用方法を指定できるキーワードです。 上記の1文で、with sharingのイメージは掴めたでしょうか。 まだイメージを掴めていない方は、with sharingの説明に入る前に、必要な前提知識を確認しておきましょう。

前提知識

以下で、with sharingを理解するための語句の意味を確認しましょう。 with sharingを理解するためには、最低限「Apex」、「クラスとオブジェクト」、「共有ルール」を理解することが必要です。

Apexとは?

Apexとは、あるプロセス処理を実行する「フロー」と、複数の関連した一連の操作を実行するのに便利な「トランザクション」の制御ステートメントをAPIへのコールと組み合わせて実行できるようにした、Salesforceで使用されるプログラミング言語です。 Apexは、webサービスやメールサービスを作成する際や、複数のオブジェクトに複雑な検証を実行する際などに使われます。 また、Apexコードは以下の手順で実行されます。 1.開発者がApexコードを作成する 2.開発者が作成したApexコードをプラットフォームに保存する 3.エンドユーザがユーザーインターフェースからApexコードを呼び出す

クラスとオブジェクトとは?

クラスとはオブジェクトを作成するためのテンプレートのことを指し、オブジェクトとはクラスのインスタンスのことを指します。 クラスは全体の操作と1つの操作に対するすべての操作を指しています。一方、オブジェクトはクラス内の特定の操作を指しています。 Apexのクラスには、最上位クラス(外部クラス)と内部クラスがあります。以下の例のように、最上位クラス(外部クラス)と内部クラスを定義できます。
public class myOuterClass {
   // Additional myOuterClass code here
   class myInnerClass {
     // myInnerClass code here
   }
}
(出典:https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_defining.htm)

共有ルールとは?

共有ルールとは、公開グループ、ロール、テリトリー内のユーザへのアクセス権を指定するルールです。 共有ルールをクラスに適用することで、レコードを参照できるユーザと参照できないユーザを指定する等の処理を実行できます。

小括-with sharingの概要

前提知識を含めた、以上の説明で、with sharingの概要を理解できましたでしょうか。 冒頭で述べたように、クラスへの共有ルールの適用方法を指定する際にwith sharingキーワードは使用されます。

with sharingに関連するキーワードの使い方

ここでは、クラスへの共有ルールの適用方法を指定するキーワードの使い方をご紹介します。 with sharingに関連するキーワードはwith sharing、without sharing、inherited sharingの3つです。以下では、これら3つの詳細を順に見ていきます。

with sharing

with sharingでは、現在のユーザの共有ルールをクラスに適用するよう指定できます。 Salesforceで利用されるApexコードは、初期状態ではシステムコンテキストで実行されるため、現在のユーザの共有ルールをクラスに適用するためには、with sharingキーワードを明示的に指定する必要があります。

with sharingの例

with sharingは、クラスの宣言時に以下の例のように使用できます。 実行例
public with sharing class sharingClass {

// Code here

}
(出典:https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm)
上記の例を詳しく見ていきましょう。 まず、アクセス修飾子はそのメソッドや変数がどのクラスで使用できるかを指定するものですが、publicはすべてのクラスでの使用を許可します。 そして、Code hereに記述されるコードにsharingClassというクラスを宣言しています。 ここで、with sharingは、Code hereに記述されるコードに現在のユーザの共有ルールを適用することを指定しています。

without sharing

反対に、without sharingは現在のユーザの共有ルールをクラスに適用しないように指定できます。 without sharingは主に、with sharingを使用することにより、宣言された別のクラスから呼び出されたコードに現在のユーザの共有ルールを適用しないように指定するために使用されます。

without sharingの例

without sharingは以下の例のように実行できます。

public without sharing class noSharing {

// Code here

}
(出典:https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm)
上記の例を詳しく見ていきましょう。with sharingの項での例と同じようにアクセス修飾子として、publicが指定されているため、Code hereに記述されるコードは、すべてのクラスで使用できるように指定されています。 また、Code hereに記述されるコードにnoSharingというクラスを宣言して、without sharingは現在のユーザの共有ルールを適用しないように指定しています。

inherited sharing

with sharingもwithout sharingも宣言しない場合は、inherited sharingを宣言できます。 Apexのクラスでは、with sharingもwithout sharingも両方宣言しない場合には、デフォルトでwithout sharingとして実行されます。しかし、これが意図しない共有宣言の省略、つまり、宣言忘れだった場合はセキュリティ上の欠陥となりえます。 そこで、with sharingもwihtout sharingも宣言しない場合は、inherited sharingを宣言することが必要です。 この宣言によって、デフォルトでwith sharingとして実行され、明示的にwithout sharingが宣言されているコンテキストから呼び出された場合のみwithout sharingとして実行されます。

inherited sharingの例

inherited sharingは以下の例のように実行できます。

public inherited sharing class InheritedSharingClass{
  // Code here
    }
}
上記の例では、with sharingやwithout sharingの例と同じように、Code hereに記述されるコードにInheritedSharingClassというクラスを宣言し、inherited sharingを宣言しています。

Apex開発では欠かせないwith sharing

今回は、Salesforceでのwith sharingについてご紹介しました。 Salesforceで用いられるApexにおいて、今回ご紹介したwith sharingはセキュリティ上の観点からも、非常に重要です。with sharingを使いこなして強固なシステムを構築していきましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】