Advertisement

More Related Content

Similar to Sfdgr19 apex 20190730(20)

Advertisement

Sfdgr19 apex 20190730

  1. ~2周年記念LT大会~ ApexのCRUDとFLS 2019/07/30(火) Sanuki Ikou @i_sanuki
  2. 自己紹介 2 讃岐 行(Sanuki Ikou) 株式会社テラスカイ Tw:@i_sanuki FB:isanuki 【コミュニティ】 • SFDG ルーキー会 • 新機能照らす会 【好きな標準系機能】 • 数式 【好きな開発系機能】 • __Share
  3. 言葉の説明① • ユーザコンテキスト(モード) – 現在のユーザの権限、項目レベルセキュリティ、および共有 ルールに従う • システムコンテキスト(モード) – 現在のユーザの権限、項目レベルセキュリティ、および共有 ルールに従わず、全部アクセス可 3
  4. 言葉の説明② 4 CRUD FLS(項目レベルセキュリティ)
  5. 突然ですが・・ 5 Apexはシステムコンテキストで動作します ※exececuteAnonymousからの実行は除く
  6. SOQL 6 List<Account> accounts = [SELECT Phone FROM Account]; for(Account acc : accounts){ System.debug(acc.Phone); } 結果→問題なし Object 参照 作成 更新 削除 取引先 ✔ 項目 参照アクセス権 編集アクセス権 電話 CRUD FLS ポイント
  7. SOQL 7 List<Account> accounts = [SELECT Phone FROM Account]; for(Account acc : accounts){ System.debug(acc.Phone); } 結果→問題なし Object 参照 作成 更新 削除 取引先 項目 参照アクセス権 編集アクセス権 電話 CRUD FLS ポイント ポイント
  8. DML 8 結果→登録可 Object 参照 作成 更新 削除 取引先 ✔ ✔ 項目 参照アクセス権 編集アクセス権 電話 CRUD FLS Account acc = new Account(Name ='株式会社テラスカイ', Phone='03-5255-3410'); insert acc; ポイント
  9. DML 9 結果→登録可 Object 参照 作成 更新 削除 取引先 ✔ 項目 参照アクセス権 編集アクセス権 電話 CRUD FLS ポイント ポイント Account acc = new Account(Name ='株式会社テラスカイ', Phone='03-5255-3410'); insert acc;
  10. 10
  11. 対策方法 「データ漏洩の防止」→「CRUDおよびFLS違反の防止」 11
  12. 対策方法 • DescribeSObjectResultクラスに実行ユーザの権限確認用 メソッドが用意されている 12 // オブジェクトや項目に参照権限があるか Schema.sObjectType.Account.isAccessible(); Schema.sObjectType.Account.fields.Phone.isAccessible(); // オブジェクトや項目に作成権限があるか Schema.sObjectType.Account.isCreateable(); Schema.sObjectType.Account.fields.Phone.isCreateable(); これらを使いながら動的にSOQLを組み立てたりDMLを実 行したりエラーにしたりする
  13. 13
  14. 14
  15. 新機能のご紹介① • WITH SECURITY_ENFORCED(ベータ) – SOQLで実行ユーザのCRUDおよびFLSを遵守してくれる 15 SOQL https://developer.salesforce.com/docs/atlas.ja- jp.apexcode.meta/apexcode/apex_classes_with_security_enforced.htm
  16. やってみる 16 List<Account> accounts = [SELECT Phone FROM Account WITH SECURITY_ENFORCED];
  17. 17
  18. 新機能のご紹介② • Security.stripInaccessible(パイロット) – SObjectから実行ユーザの権限に従って項目を取り除くなど – つまりFLSを遵守できる 18 (主に)DML https://releasenotes.docs.salesforce.com/ja-jp/summer19/release- notes/rn_apex_Security_stripInaccessible.htm
  19. やってみる 19 Object 参照 作成 更新 削除 取引先 ✔ ✔ 項目 参照アクセス権 編集アクセス権 電話 CRUD FLS コードは次ページ↓ 電話への権限無し
  20. やってみる 20 List<Account> accounts = new List<Account>{ new Account(Name='hoge1'), new Account(Name='hoge2', Phone='03-1111-2222') }; SObjectAccessDecision decision = Security.stripInaccessible( AccessType.CREATABLE, accounts); for(SObject sobj : decision.getRecords()){ // 権限のない項目は除外されている確認 System.debug(sobj); } insert decision.getRecords();
  21. 結果 21 USER_DEBUG|[13]|DEBUG|Account:{Name=hoge1} USER_DEBUG|[13]|DEBUG|Account:{Name=hoge2} SObjectから電話が取り除かれている 電話なしで作成されている
  22. 22
  23. まとめ • Apexはシステムコンテキストで動作する • Describeを使って頑張ることも可能 • 新機能に期待 23
  24. 24
Advertisement