tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Apexとセキュリティチェック

f:id:tyoshikawa1106:20150117230834p:plain

Apexクラス内の処理はシステム権限で実行されます。そのため、誤って処理を実行しないようにするには自分で判定処理を用意する必要があります。


基本的に権限のないユーザにはVisualforceページやApexクラスのアクセス権限自体を与えなかったり、Visualforce側のapexタグで非表示になったりするので細かく判定しなくてもある程度防止することができます。


またApexTriggerやApexBatchなど、どのユーザが実行しても権限に関係な処理を実行したい場合もあります。


必要に応じて判定処理を入れることでより品質の高いコードにすることができます。

オブジェクトの権限セキュティチェック

オブジェクトの権限チェックを行うことで権限の無いユーザが誤って処理を実行するのを防ぐことができます。また判定結果で対象外と判定された際にメッセージを表示するようにしておけばエラー原因を特定しやすくなります。

f:id:tyoshikawa1106:20150117233519p:plain

オブジェクトの参照権限判定
Schema.sObjectType.Account.isAccessible()
オブジェクトの作成権限判定
Schema.sObjectType.Account. isCreateable()
オブジェクトの編集権限判定
Schema.sObjectType.Account. isUpdateable()
オブジェクトの削除権限判定
Schema.sObjectType.Account. isDeletable()

項目のセキュリティチェック

オブジェクト側に権限があっても項目レベルセキュティ側で権限が無い場合があります。Apex側できちんと判定することでより品質の高いコードになります。権限チェックは項目毎に判定する方が確実です。

f:id:tyoshikawa1106:20150117233232p:plain

項目の参照権限判定
Schema.sObjectType.Account.Fields.Name.isAccessible()
項目の作成権限判定
Schema.sObjectType.Account.Fields.Name.isCreateable()
項目の編集権限判定
Schema.sObjectType.Account.Fields.Name.isUpdateable()

サンプルコード

簡単なサンプルをつくりました。権限の無いユーザでSaveボタンをクリックするとエラーメッセージが表示されます。

f:id:tyoshikawa1106:20150117235456p:plain

Apex Security Check Sample

権限判定処理のテスト

テストクラスで権限判定の処理をテストしたい場合はSystem.runAs()をつかって対象プロファイルのユーザに切り替えてテストします。

 static testMethod void isAccessibleTest1() {

        // Test System Admin User
        System.runAs(testAdminUser) {
            Boolean result = helper.isAccessible();
            System.assertEquals(result, true);
        }

        // Test Other User
        System.runAs(testOterProfileUser) {
            Boolean result = helper.isAccessible();
            System.assertEquals(result, false);
        }
    }

テストの際に気をつけることとしてプロファイルはシステム情報なのでクエリを実行して取得するのがいいと思いますが、ユーザはテストクラス内で作成する必要があります。


テスト実行時のログインユーザは必ずシステム管理者ユーザになるのでこのユーザは作成する必要はありませんが、それ以外のプロファイルのユーザの場合は、テスト作成後にユーザが無効化されたり凍結されたりするケースが考えられます。もしかするとプロファイルが変更されることもあるかもしれません。


そういった問題を回避するためにもテストで使用するユーザはテストクラス内で用意するようにした方がいいと思います。