« Apexのトランザクション制御 | メイン | Force.com IDE for Winter '11がリリースされました »

2010年11月 9日 (火)

with sharingキーワードとwithout sharingキーワード

Apexはデフォルトでシステムモードで動作するので、全オブジェクトに対して全レコードの編集が可能です。

そのため、例えば、ユーザがVisualforceページでレコードを検索する場合、ユーザが参照権限を持たないレコードについても、検索できてしまいます。

ユーザが参照可能なレコードのみを検索できるようにするには、Apexクラスにwith sharingキーワードを付与します。
これによって、ユーザに適用されているレコードレベルの共有ルールを強制実行することができますユーザモードでの動作)。

public with sharing class SharingClass {

}

ここで注意しなくてはならないのは、with sharingキーワードを付与しても、オブジェクトのCRUD権限、項目のアクセス権限は、システムモードのままということです。ユーザがアクセスできないはずのオブジェクトや項目にアクセスできてしまいます。

オブジェクトのCRUD権限、項目のアクセス権限は、Apexでは制御できないので、開発者が、ユーザから隠されているデータを公開しないように注意してApexコードを書く必要があります。

逆に、ユーザに適用されている共有ルールを強制実行されないようにするには、without sharingキーワードを付与します。

public without sharing class NoSharingClass {

}

with sharingキーワードもwithout sharingキーワードも付与しない場合は、呼び出し元のApexクラスの設定が有効となります。
例えば、with sharingキーワードが付与されたApexクラスから、キーワードなしのApexクラスを呼び出した場合、ユーザに適用されている共有ルールが強制実行されます。呼び出し位置が最上位レベルの場合(最初に呼ばれるApexクラスの場合)は、システムモードでの動作となります。

動作モードを表にまとめるとこうなります。

呼び出し位置 キーワード
なし without sharing with sharing
最上位レベル システムモード システムモード ユーザモード
最上位レベル以外 呼び出し元のモードと同じ システムモード ユーザモード

ちなみに、トリガはシステムモードの動作となりますが(トリガにはキーワードを付けることができない)、トリガ内部でwith sharingキーワード付きのApexクラスを呼び出すことで、ユーザモードでの動作となります。

また、匿名ブロックは、ユーザモードでの動作となります。

コメント

>tamaさん

とてもわかりやすいですね。

Salesforceのマニュアルにも同様の記述がありますが、
sharingキーワードがない場合とwithout sharingキーワードを使用した場合ではどこに違いがあるのか、とまどったことがありました。

Force.com OneAppを使用する際、with sharingを使用して、アクセスするオブジェクトを少なくする等の工夫が必要となるので、このようにまとまった形で公開してくれるのはとても助かります。

>ysさん

コメントありがとうございます!

私自身、with/without sharingキーワードの挙動で戸惑って、詳しく調べたことがあったので、まとめてみました。

これからも、役立つ情報をお届けしていきたいと思ってますので、是非よろしくお願いします。

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上
でのWebアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

  • 株式会社フレクトは、
      ・認定コンサルタント
      ・認定上級デベロッパー
      ・認定デベロッパー
    が在籍している、セールスフォースパートナーです。
    また、heroku partnersにも登録されています。
    herokuパートナー
    株式会社フレクト
    Salesforce/Force.com
    導入支援サービス
    弊社の認定プロフェッショナルが支援致します。
    ・Visualforce/Apexによるアプリ開発
    ・Salesforceと連携するWebアプリ開発
    も承っております。
    セールスフォースご検討の際は、
    お気軽にお問合せください。

Twitter

リファレンス

■Developer's Guide(リファレンス)
・Apex  HTML | PDF | 日本語PDF | ガバナ制限
・Visualforce  HTML | PDF
・Web Services API  HTML | PDF | 日本語PDF
・Bulk API  HTML | PDF
・REST API  HTML | PDF | 日本語PDF
・Metadata API  HTML | PDF
・Migration Tool  HTML | PDF
・AJAX Toolkit  HTML | PDF
・Data Loader PDF | 日本語PDF

■早見表 (日本語)
数式
Apex
Visualforce
Web Services API
Chatter