
Apex 개발 시 보안적으로 적용해야 할 요소 중 하나인 User Mode에 대해 소개한다.
Apex는 기본적으로 System Mode에서 동작한다.
System Mode에서는 오브젝트 레벨 권한, 필드 레벨 권한을 모두 가지고 있는 채로 동작하게 된다.
레코드 레벨은 Apex Class의 with sharing, without sharing 키워드를 사용해 정해줄 수 있다.
최근 릴리즈로 Database와 Search 메서드들이 accessLevel 파라미터를 지원하기 시작했다.
Database와 Search 오퍼레이션들을 수행할 때 유저 모드에서 동작할지 시스템 모드에서 동작할지를 정해줄 수 있다.
시스템 모드와 유저 모드를 정리해보자면 아래와 같다.
시스템 모드
- FLS와 Object Permission을 모두 가진 채로 동작
- Sharing rule은 sharing 키워드를 가지고 제어 (Record-Level)
유저 모드
- FLS와 Object permission이 현재 Context를 실행한 유저에 맞게 동작함.
- Sharing rule은 항상 적용됨. (Record-Level)
그러면 실제 유저모드를 적용한 Database operation은 어떻게 해야하는지 예시를 보자.
먼저 SOQL 사용 시, WITH USER_MODE 혹은 WITH SYSTEM_MODE 라는 키워드를 쿼리 마지막에 붙여 해당 SOQL을 어떤 모드에서 실행할 지 명시해줄 수 있다. 예를 들어, 어떤 유저가 Account 레코드를 하나 업데이트를 하여 유발된 Account Trigger 코드에서 현 사용자의 FLS와 Object permission을 그대로 따라 적용하고 싶을 때 아래와 같이 쿼리를 작성하면 된다. 권한이 없는 사용자 문맥에서 아래 쿼리가 실행되면 에러를 던질것이다.
List<Account> acc = [SELECT Id FROM Account WITH USER_MODE];
insert나 update같은 DML을 사용할 땐 "as user" 와 같은 키워드를 사용할 수 있다.
Account acc = new Account(Name = 'Test');
insert as user acc;
위와 같이 데이터 보안을 적용시킨 코드에서 권한이 없는 사용자가 해당 context의 사용자일 경우, SecurityException를 던지게 된다.
아직 Developer preview 기능이긴 하지만 permission set을 가지고도 DML과 쿼리 시 권한 체크를 할 수 있게 한다고 한다.
'Salesforce > Salesforce Dev' 카테고리의 다른 글
| Apex Transaction Control과 Email Invocations (0) | 2024.05.27 |
|---|---|
| Invocable Apex Method (0) | 2024.05.27 |
| Comparator Interface and Collator Class (0) | 2024.05.24 |
| Comparable Interface (0) | 2024.05.24 |
| Apex Null Coalescing Operator (0) | 2024.05.12 |