SalesforceのApexクラスでwith sharingを使う意味

※本サイトにはプロモーション・広告が含まれています。

(最終更新月: 2023年12月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforce ApexでのWith Sharingキーワードとは何か?」
「With Sharingを使用する際のメリットとは?」
「With Sharingキーワードを適用したApexクラスの実装例はどのようなものか?」

✔当記事を読むことで得られる知識

  • Salesforce ApexにおけるWith Sharingキーワードの基本概念
  • With Sharingキーワードの使用方法とその影響
  • With Sharingキーワードを用いたApexクラスの具体的な例

当記事では、Salesforceの開発言語であるApexにおけるWith Sharingキーワードの役割と重要性について解説します。

With Sharingキーワードを使用することで、クラスやメソッドが実行される際のユーザー権限と共有ルールに基づいたデータアクセス制御が可能です。

ぜひ最後までご覧ください。

Salesforce

定義や属性などは公式ガイドを必ず参考にしましょう。

当記事では、主にその使い方を具体例とともに解説します。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

プロダクトマネージャーとして、Apex・Visualforceの開発エンジニアとして、以下のようなプロジェクトに従事してきました

  • 新規事業の立ち上げに伴うビジネスプロセス構築とSalesforceのカスタマイズ
  • SFDXを活用した大規模リリース
  • Visualforce等による一般ユーザー向けサイト・アプリケーションの構築

相談・業務の依頼も承ります。ご質問・ご希望をお問い合わせください。

「with sharing」の基本概念

こちらでは、「with sharing」の基本概念についてお伝えしていきます。

「with sharing」キーワードを理解することで、Salesforceのセキュリティを適切に管理し、データ保護に役立てられます。

  • 「with sharing」キーワードとは何か
  • Salesforceのセキュリティモデルとの関連性
  • 「with sharing」vs「without sharing」

「with sharing」キーワードとは何か

「with sharing」キーワードは、Apexクラスが実行されるときに、ユーザーのデータアクセスレベルに基づいたセキュリティ制約を適用するSalesforceの宣言です。

Apexクラスにwith sharingを記述すると、そのクラス内で行われるデータアクセスは、実行しているユーザーの権限やシェアリングセッティングに基づいて制限されます。

例えばコード内で、以下のように定義されます。

public with sharing class MySecureApexClass {
    // クラス内のメソッドと変数がここにくる
}

このキーワードを使用することで、プログラム的なデータアクセスが組織内のセキュリティポリシーに従っておこなわれるようになります。

Salesforceのセキュリティモデルとの関連性

「with sharing」キーワードはSalesforceのセキュリティモデルの根幹をなす機能のひとつです。

このセキュリティモデルは、組織内の異なるレベルのユーザーが異なるデータセットにアクセスできるようにするために、複数のレイヤーで構築されています。

例えば、以下のようなセキュリティ要素によって制御されます。

  • プロファイル
  • 役割
  • パーミッションセット
  • 共有ルール

with sharing を適用するクラスはこれらのセキュリティ設定を尊重し、コードを通じてユーザーがアクセスできるレコードを適切に制限します。

「with sharing」vs「without sharing」

「with sharing」と「without sharing」は、Apexクラスにおけるデータの可視性を制御するための二つの異なるキーワードです。

  • 「with sharing」: ユーザーのセキュリティ設定に基づいてレコードの可視性を制限
  • 「without sharing」: ユーザーのセキュリティ設定を無視して、全レコードにアクセスが可能になる

適切なキーワードの選択は、アプリケーションのセキュリティ要件によって異なります。

エンタープライズアプリケーションでは通常、セキュリティを強化するために「with sharing」が推奨されます。

「with sharing」の適用と影響

こちらでは、「with sharing」の適用方法とそれによる影響について考察します。

「with sharing」を適切に導入することで、アプリケーションのセキュリティを強化し、ユーザーに適切なデータのみを見せられます。

  • 「with sharing」のApexクラスへの適用方法
  • ユーザーのアクセス権とレコード可視性への影響
  • 「with sharing」と「without sharing」の選択基準

「with sharing」のApexクラスへの適用方法

「with sharing」をApexクラスに適用するには、クラス定義の先頭にキーワードを付け加えます。

以下はその具体例です。

public with sharing class SecureDataAccess {
    // このクラスでのデータアクセスはユーザーの権限を尊重する
}

このように追加することで、そのクラス内の全てのメソッドは実行ユーザーの権限に応じたデータにのみアクセス可能となります。

これは、とくにユーザーに対してレコードレベルのセキュリティを厳格に適用する場合に重要です。

ユーザーのアクセス権とレコード可視性への影響

「with sharing」を適用することにより、ユーザーの権限が適切に反映され、ユーザーが見れるレコードに影響します。

具体的には、ユーザーのプロファイルや役割、共有ルールに基づいてデータアクセスが調整されます。

この方法で、ユーザーは彼らが持っている権限で許可されたデータのみ閲覧でき、データ漏洩のリスクを減少させます。

「with sharing」と「without sharing」の選択基準

「with sharing」と「without sharing」を適切に選択するための基準は、アプリケーションのセキュリティ要件に依存します。

データの機密性が高く、ユーザー間で厳格なアクセス制御が必要な場合は「with sharing」を選択。

一方で、システムユーザーや管理タスクに対しては「without sharing」が適切になることがあります。

各ケースでセキュリティポリシーを検討し、最適な選択をおこなってください。

「with sharing」の実践的な使用例

こちらでは、「with sharing」の概念を実世界の例に適用して、そのメリットと実装の方法を理解しやすくします。

実践的な使用例を通じて、「with sharing」を活用することの便益を深く理解できるでしょう。

  • 共有ルールとの連携
  • 権限に基づくデータアクセスの管理
  • セキュリティとデータ保護のためのベストプラクティス

共有ルールとの連携

「with sharing」を使用するひとつの実践的な方法は、共有ルールとの連携です。

共有ルールを通じて、特定の条件を満たすレコードに対して追加の共有設定をおこなえます

たとえば、以下のような共有ルールの定義が可能です。

trigger SharingContact on Contact (before insert, before update) {
    Group salesTeam = [SELECT Id FROM Group WHERE Name='Sales Team'];
    for (Contact c : Trigger.new) {
        if (c.Revenue__c > 100000) {
            // レコードの共有ルールを変更する
            // セールスチームに共有する
        }
    }
}

この共有ルールは、一定の収益を超える顧客情報をセールスチームと共有するために使用されます。

「with sharing」を適用されたApexクラス内でこのトリガーが起動される場合、トリガー実行者のセキュリティ権限に基づき、共有処理がおこなわれます。

権限に基づくデータアクセスの管理

権限に基づいたデータアクセス管理は、組織内で情報を保護するうえで最も重要な側面のひとつです。

「with sharing」を適用したApexクラスにより、実行者の権限に適合するデータのみを扱うようになります。

public with sharing class AccountManager {
    public List<Account> getHighValueAccounts() {
        return [SELECT Id, Name, AnnualRevenue FROM Account WHERE AnnualRevenue > :threshold LIMIT 100];
    }
}

このメソッドでは年収が特定のしきい値以上のアカウントのみを取得します。

「with sharing」があるため、実行者にアカウントへの適切なアクセス権限がない場合、これらのレコードは結果には含まれません。

SOQLクエリの場合、項目レベルでアクセス制限されている場合、特定のフィールドが見れない場合もあります。

うまく動かない場合は、必ず確認しましょう。

セキュリティとデータ保護のためのベストプラクティス

セキュリティとデータ保護のために、いくつかのベストプラクティスを採用することが推奨されます。

ひとつは、セキュリティ要件の変化に応じて「with sharing」と「without sharing」の使い分けを適切におこなうこと。

また、開発者は常に最小限のアクセス原則を適用し、必要な情報のみをユーザーに開示するようにコードを設計するべきです。

そして、定期的なセキュリティレビューとコードの監査を行うことで、安全性が確保された状態を維持します。

public with sharing class AccessAuditor {
    // コードのセキュリティ監査に使用される方法
    // ログイン試行の監視やアクセスパターンの分析を行う
}

一貫性のあるセキュリティポリシーの実施と、開発中にセキュリティベストプラクティスへの遵守により、データ漏洩や不正アクセスを効果的に防げます。

「with sharing」のトラブルシューティング

「with sharing」をうまく適用したとしても、時には予想外の問題が発生することがあります。

問題解決のためのアプローチを学ぶことで、より堅牢なアプリケーションを構築するのに役立つでしょう。

  • 「with sharing」に関する一般的な問題
  • セキュリティエラーの特定と解決
  • コーディング時のセキュリティ検討事項

「with sharing」に関する一般的な問題

「with sharing」に関して遭遇する一般的な問題には、予期しないアクセス拒否エラーやデータ可視性の問題があります。

これは、セキュリティ設定が適切に更新されなかったり、開発者がユーザーの権限を過小評価したりすることによって起こることが多いです。

これらの問題に対処するには、クラスと権限の関係を詳しく確認し、コードとセキュリティ設定の整合性を保ちましょう。

セキュリティエラーの特定と解決

セキュリティエラーを特定するには、エラーメッセージの精査やシステムログの分析が有効です。

例えば、System.debugメソッドを使用してコード内にデバッグステートメントを挿入し、問題が発生している具体的な場所を把握できます。

System.debug('Current User ID: ' + UserInfo.getUserId());

コードのこの部分に到達すると、実行中のユーザーのIDがデバッグログに出力されるため、エラーの調査が容易になります。

綿密なデバッグをおこなうことで、セキュリティ設定が原因の問題を特定し、適切な修正を加えることが可能となります。

コーディング時のセキュリティ検討事項

セキュリティをコードに組み込む際には、常にユーザーのアクセスレベルを念頭に置いた開発が求められます。

これは、データの敏感性を評価し、with sharingwithout sharingの使用を判断する際に不可欠です。

また、レコードの作成や更新の際には、以下のようなメソッドを使ってフィールドレベルの権限を確認することが推奨されます。

  • isAccessible()
  • isCreatable()
  • isUpdatable()
if (Schema.sObjectType.Account.fields.Name.isUpdatable()) {
    // ユーザーがアカウント名を更新できる場合のみ、更新処理を行う
}

このようなセキュリティ検討事項をコーディングに取り入れることで、不正アクセスのリスクを減らし、コードの堅牢性を高められます。

「with sharing」の拡張と応用

Salesforceは常に革新を続け、そのプラットフォームに新しい機能や改善が追加されています。

「with sharing」も例外ではなく、その範囲や使い勝手は進化し続けているのです。

  • 「with sharing」の進化とSalesforceの最新動向
  • カスタムパーミッションとの組み合わせ
  • より高度なセキュリティモデルへの適応

「with sharing」の進化とSalesforceの最新動向

セールスフォースはプラットフォームのアップデートを通じて、「with sharing」の動作を拡張し、より細かな制御を可能にしています。

例えば、「inherited sharing」という新しいキーワードが導入され、既存のクラスの共有設定を継承できるようになりました。

これは次のようなケースに有効です。

public inherited sharing class InheritedSharingExample {
    // 親クラスの共有設定を継承する
}

また、レコードの所有者が変わる際の動作のカスタマイズや、シェアリングルールに対する高度な制約の適用など、セキュリティモデルは進化しています。

Salesforceのリリース注記とコミュニティフォーラムに常に注意を払い、最新のベストプラクティスを取り入れることが大切です。

カスタムパーミッションとの組み合わせ

カスタムパーミッションによる柔軟なアクセス制御を、「with sharing」キーワードと組み合わせ、細かくチューニングされたセキュリティポリシーを実現できます。

カスタムパーミッションはユーザーやグループに特定の操作が許可されているかを確認するときに便利。

以下のように使用できます。

if (FeatureManagement.checkPermission('CustomPermissionName')) {
    // ユーザーに特定の操作を許可する
}

このコードスニペットは、カスタムパーミッション「CustomPermissionName」が設定されている場合にのみ、特定の操作を許可する条件分岐を示しています。

この粒度の高い制御により、組織のニーズに合わせたセキュリティポリシーを実装できます。

より高度なセキュリティモデルへの適応

Salesforceのセキュリティモデルは、常に複雑さを増してます。

「with sharing」を含めたセキュリティの概念を完全に理解し適応させることは、高度な知識を要するでしょう。

例えば、より高度なセキュリティ要件に対応するために、領域別セキュリティ(Transactional Security)の導入や、セキュリティアサーションのパターンの使用が考えられます。

UserPermissionAccess.assertPermission('CustomDataAccess');

このコード行は、ユーザーがカスタムデータにアクセスするための権限があることを確実にするためのセキュリティチェックを実行するもの。

このような高度なテクニックを利用することで、企業は自社のデータをより強固に守れます。

まとめ

当記事では、「with sharing」の基本から実践的な使用例、トラブルシューティング、さらなる拡張と応用に至るまで詳しく説明しました。

正しく理解し適用することで、「with sharing」キーワードはSalesforceにおけるデータセキュリティとアクセス制御の強力なツールになります。

この知識を活用し、セキュリティが維持された信頼できるアプリケーションを構築しましょう。

常に最新のSalesforceの動向を把握し、セキュリティ概念の拡張に対応していくことが重要です。

エンタープライズレベルのアプリケーションにおいては、セキュリティは最優先事項であり、それを支援する「with sharing」の重要性はこれからも高まるでしょう。

タイトルとURLをコピーしました