Apex Academy
Módulo 12·02·25 min

CRUD y FLS: comprobar antes de tocar

Los permisos de objeto (crear, leer, editar, borrar) y la seguridad a nivel de campo los configuras tú en perfiles y permission sets. El código en modo sistema no los mira, así que tiene que preguntarlo antes de leer o guardar.

En Admin esLos permisos de objeto de un perfil y la pantalla Field-Level Security de un campo

✓ En esta sub-lección

  1. 01Distinguir sharing, permisos de objeto (CRUD) y seguridad a nivel de campo (FLS).
  2. 02Preguntar a Schema si el usuario puede hacer una operación sobre un objeto o un campo.
  3. 03Rechazar la operación con un mensaje claro cuando no puede.

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

¿Qué decide with sharing?

Segundo hallazgo de la auditoría: un becario tiene un perfil de solo lectura sobre Opportunity y el campo Discount__c oculto. Desde el panel, pulsa «Aplicar descuento» y el descuento se guarda. En la interfaz no podría ni ver el campo. El código lo ha hecho por él, porque en nadie pregunta.

Tres capas, tres preguntas

CapaPreguntaDónde lo configuras tú
Permisos de objeto (CRUD)¿Puede crear, leer, editar o borrar este objeto?Perfil o permission set → Object Settings
Seguridad a nivel de campo (FLS)¿Puede ver o editar este campo?Field-Level Security del campo
Sharing¿Puede ver este registro?OWD, roles, reglas de sharing

Preguntárselo a Schema

Apex
// Permisos de objeto
Schema.sObjectType.Opportunity.isAccessible();    // ¿leer?
Schema.sObjectType.Opportunity.isCreateable();    // ¿crear?
Schema.sObjectType.Opportunity.isUpdateable();    // ¿editar?
Schema.sObjectType.Opportunity.isDeletable();     // ¿borrar?

// Seguridad a nivel de campo
Schema.sObjectType.Opportunity.fields.Discount__c.isAccessible();   // ¿ver el campo?
Schema.sObjectType.Opportunity.fields.Discount__c.isUpdateable();   // ¿editarlo?
Todas devuelven un Boolean para el usuario que está ejecutando el código. Se pregunta antes de consultar o guardar, y si la respuesta es no, se rechaza con un mensaje.

PERMISOS DEL USUARIO

EL CÓDIGO

  • Opportunity.isUpdateable()false
  • fields.Discount__c.isUpdateable()false
applyDiscount():Rechazado

RenewalSecurityException: No tienes permiso para editar oportunidades

Cambia los permisos del usuario y mira qué responde cada pregunta y si el descuento llega a guardarse.

La nutria: Tus permisos, que el código tiene que respetar

Esto lo configuras tú todos los días: los permisos de objeto de un perfil y la Field-Level Security de cada campo. En la interfaz, Salesforce los aplica solo. Lo que me sorprendió al empezar con Apex es que el código en modo sistema pasa por encima de todo ese trabajo si nadie lo comprueba. Un developer que viene de Admin tiene aquí ventaja: sabe exactamente qué está en juego.

La nutria: ¿Y por qué no un Flow? Porque en Flow depende del mismo ajuste

Con franqueza: un flow en contexto de usuario respeta los permisos de objeto y de campo sin que hagas nada, y uno en contexto de sistema se los salta, igual que el Apex antiguo. No es una carencia de Flow ni una ventaja de Apex: es la misma decisión en dos herramientas. Lo que el código añade es la posibilidad de preguntar campo a campo y contestar con tu propio mensaje.