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 esta sub-lección
- 01Ejecutar consultas y guardados en modo usuario.
- 02Quitar de un resultado los campos que el usuario no puede ver.
- 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
// 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];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.
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