Apex Academy
Módulo 12·03·30 min

Security.stripInaccessible y WITH USER_MODE

En lugar de comprobar permiso a permiso, le pides a Salesforce que ejecute la consulta o el guardado como lo haría el usuario: WITH USER_MODE y «as user». Y cuando prefieres quitar lo que no puede ver en vez de fallar, Security.stripInaccessible.

En Admin esPoner un flow en «User Context» en vez de comprobar cada permiso con una Decision

✓ En esta sub-lección

  1. 01Ejecutar consultas y guardados en modo usuario.
  2. 02Quitar de un resultado los campos que el usuario no puede ver.
  3. 03Elegir entre fallar y recortar según el caso.

La nutria: ¿Te acuerdas? · Repaso de la lección 2

¿Qué expresión dice si el usuario puede editar el campo Discount__c?

Las comprobaciones de la tarea 2 funcionan, pero son dos líneas por campo y es fácil olvidar una. Tercer hallazgo de la auditoría: el panel devuelve el campo Margin__c, el margen de cada renovación, a comerciales que lo tienen oculto. Nadie escribió su comprobación. Hace falta algo que no dependa de acordarse.

Modo usuario: que lo compruebe la plataforma

Apex
// Consulta en modo usuario: objeto, campos y sharing del usuario
Opportunity o = [SELECT Id, Discount__c FROM Opportunity WHERE Id = :oppId WITH USER_MODE];

// Guardado en modo usuario
update as user o;

// Y lo contrario, cuando el proceso necesita todo el poder, dicho en voz alta
List<Opportunity> all = [SELECT Id FROM Opportunity WITH SYSTEM_MODE];
En modo usuario, si el usuario no puede leer o editar algo de lo que toca la operación, Salesforce lanza una excepción en vez de hacerlo. insert, update y delete admiten «as user» y «as system».

Igual que con el sharing, aquí también cambió el valor por defecto: hasta la versión 66 de la API, las consultas y los guardados iban en modo sistema; desde la 67 (Summer '26), en modo usuario. Y la conclusión es la misma: no lo dejes implícito. Escribir WITH USER_MODE o WITH SYSTEM_MODE hace que el código se comporte igual en cualquier versión, y que quien lo lea sepa que lo decidiste.

EJECUTA: UN COMERCIAL SIN ACCESO A MARGIN__C

[SELECT Name, Amount, Margin__c
 FROM Opportunity WITH SYSTEM_MODE]

LO QUE VUELVE

  • Acme 2026 · 12.500 €Margin__c: 38 %
  • Globex 2026 · 8.200 €Margin__c: 41 %

Vuelve todo, margen incluido: el comercial ve un campo que tiene oculto.

La misma consulta, en modo sistema, en modo usuario y con stripInaccessible: qué vuelve para un comercial que no puede ver el margen.

Recortar en vez de fallar

A veces no quieres una excepción: el panel debería enseñar las renovaciones a todos, con el margen solo para quien pueda verlo. Security.stripInaccessible, con AccessType.READABLE y la lista de registros, devuelve una copia de la lista sin los campos que el usuario no puede leer. Con AccessType.UPDATABLE o CREATABLE, recorta antes de guardar. La regla práctica: para guardar, modo usuario, que falla si no puede; para mostrar, recortar.

La nutria: ¿Y por qué no un Flow? Porque es el mismo desplegable

WITH USER_MODE es poner el flow en «User Context»: Salesforce aplica los permisos del usuario por ti. Y WITH SYSTEM_MODE es «System Context». Flow lo decide una vez para todo el flow; Apex te deja decidirlo operación por operación, que es justo lo que hace falta aquí: consultar con todo el poder y recortar después. En Flow no hay un equivalente de recortar los campos que el usuario no puede ver: o el flow entero respeta los permisos, o no los respeta.