Modelo de Datos de Permisos - Salesforce
About
Este documento describe el modelo de datos que representa los permisos en Salesforce, detallando:
- Los objetos involucrados en la definición de permisos
- Las relaciones entre dichos objetos
- Los mecanismos de asignación a usuarios
- Cómo se calcula el acceso efectivo
1. Arquitectura General del Modelo de Seguridad
Salesforce implementa un modelo de seguridad multicapa basado en el principio de acumulación de permisos y separación de responsabilidades.
Las capas principales son:
- Identidad → User
- Autorización Base → Profile
- Permisos Modulares → Permission Set
- Agrupación de Permisos → Permission Set Group
- Seguridad a Nivel de Objeto y Campo → ObjectPermissions + FieldPermissions
- Seguridad a Nivel de Registro → OWD + Role Hierarchy + Sharing
- Restricción Adicional → Restriction Rules
Cada capa cumple una función específica dentro del cálculo del acceso efectivo.
2. Identidad y Permiso Base
2.1 User
API Name: User
Representa la identidad autenticada dentro del sistema.
Campos clave
- Id
- ProfileId
- UserRoleId
- IsActive
- UserType
Relaciones estructurales
User
├── Profile
├── PermissionSetAssignment
└── PermissionSetGroupAssignment
Relación N:N con PermissionSet vía PermissionSetAssignment
El objeto User no almacena permisos directamente.
Solo referencia estructuras que los contienen.
2.2 Profile
API Name: Profile
Define el conjunto base obligatorio de permisos asociado a cada usuario.
Concepto Arquitectónico Clave
Internamente, *cada Profile es un PermissionSet especial.*
En el objeto PermissionSet:
- IsOwnedByProfile = true
- ProfileId ≠ null
Profile = PermissionSet (IsOwnedByProfile = true)
Es decir:
- Cada Profile tiene un registro correspondiente en PermissionSet
- Ese PermissionSet contiene los permisos reales del perfil
Esto significa que: Profile → técnicamente es un PermissionSet
Esto explica por qué muchas consultas técnicas deben realizarse sobre PermissionSet incluso cuando conceptualmente hablamos de Profile.
3. PermissionSet – Unidad Básica de Permisos y Nucleo del modelo
API Name: PermissionSet
Es el objeto central del modelo de permisos, la unidad estructural donde realmente los permisos se almacenan.
Campos importantes
- Id
- Name
- Label
- IsOwnedByProfile
- ProfileId
- PermissionSetGroupId
- PermissionsModifyAllData
Contiene tanto permisos de sistema como relaciones a objetos hijos que representan permisos específicos.
Es en este objeto donde radica el poder del motor se seguridad de salesforce dado su comportamiendo polimorfico
3.1 Unidad Básica de Permisos
Los permisos reales se almacenan en objetos relacionados.
3.1.1 ObjectPermissions
API Name: ObjectPermissions
Representa permisos CRUD sobre objetos.
Campos Principales
- ParentId → Lookup a PermissionSet
- SObjectType
- PermissionsRead
- PermissionsCreate
- PermissionsEdit
- PermissionsDelete
- PermissionsViewAllRecords
- PermissionsModifyAllRecords
Relación
PermissionSet (1) —— (N) ObjectPermissions
Controla acceso a nivel de objeto.
No controla acceso a registros específicos.
3.1.2 FieldPermissions
API Name: FieldPermissions
Representa seguridad a nivel de campo (Field Level Security).
Campos Principales
- ParentId
- SObjectType
- Field
- PermissionsRead
- PermissionsEdit
Relación
PermissionSet (1) —— (N) FieldPermissions
Controla visibilidad y edición de campos.
No controla acceso al objeto ni al registro.
3.1.3 SetupEntityAccess
Permite acceso a componentes de metadata como:
- ApexClass
- ApexPage
- CustomPermission
- CustomMetadata
Campos
- ParentId
- SetupEntityId
- SetupEntityType
3.1.4 ApexClassAccess
En algunos contextos aparece como entidad separada.
Campos
- ParentId
- ApexClassId
3.1.5 CustomPermission
Permisos personalizados definidos por configuración.
Objetos involucrados
- CustomPermission
- SetupEntityAccess
Uso típico
- Feature toggles
- Validaciones condicionales en Apex
- Control de UI dinámico
3.2 Nucleo del modelo y Naturaleza Polimórfica
PermissionSet es la unidad real que el motor de seguridad evalúa.
Profiles, Permission Set y Permission Set Groups son abstracciones administrativas que terminan materializándose como registros en el objeto PermissionSet.
Todo permiso evaluado proviene de un PermissionSet.
Puede representar:
- Profile
- Permission Set independiente
- Permission Set Asociado a Group
Todos son registros del mismo objeto: PermissionSet.
Campos que permiten identificar su rol:
TypeIsOwnedByProfileProfileIdPermissionSetGroupId
3.2.1 Profile
Es internamente un PermissionSet especial
Campos tipicos:
- `Type = 'Profile'`
- `IsOwnedByProfile = true`
- `ProfileId != null`
3.2.2 Permission Set Independiente
- Creado manualmente
- No pertenece a ningún grupo
- Asignable directamente mediante
PermissionSetAssignment.
Campos tipicos:
- `Type = 'Regular'`
- `ProfileId = null`
- `PermissionSetGroupId = null`
3.2.3 Permission Set Asociado a Group
Un Permission Set relacionado con un Permission Set Group puede participar en tres roles distintos:
- Permission Set Componente del grupo
- Muting Permission Set
- Permission Set agregado (consolidado)
Es importante distinguir cómo se relaciona cada uno con el Group.
Permission Set Componente del grupo
Es un Permission Set independiente existente que ahora forma parte de un Permission Set Group.
Su relación con el grupo se define mediante el objeto:
PermissionSetGroupComponent
Importante:
- No se crea un nuevo registro en PermissionSet.
- Se reutiliza el mismo Id del Permission Set original.
- El campo PermissionSetGroupId permanece en null.
El componente no está vinculado al grupo por campo, sino por la tabla intermedia PermissionSetGroupComponent.
Cuando el Group es asignado a un usuario:
- El motor de seguridad no evalúa directamente el Permission Set componente.
- Evalúa el PermissionSet agregado generado para el Group.
No se crea un nuevo registro en PermissionSet. Se reutiliza el mismo Id.
Aquí ocurre algo importante: El motor NO evalúa Permission Set independiente para el usuario. Evalúa el PermissionSet Agregado generado por el sistema.
Ese PermissionSet agregado:
- Incluye los permisos de Permission Set independiente que se encuentran en el PSG
- Aplica exclusiones de Muting (si existen)
Muting Permission Set
Cuando se crea un Permission Set Group, Salesforce genera automáticamente un PermissionSet adicional.
Este registro:
- Es distinto de los Permission Sets componentes.
- Tiene PermissionSetGroupId != null.
- Está estructuralmente vinculado al Group mediante ese campo.
El Muting:
- No modifica los Permission Sets originales.
- No elimina permisos estructuralmente.
- Define exclusiones aplicadas durante la consolidación del Group.
Es un registro nuevo en el objeto PermissionSet.
Permission Set agregado (consolidado)
Cuando un Permission Set Group es asignado a un usuario, Salesforce:
- Identifica los Permission Sets componentes.
- Aplica las exclusiones definidas en el Muting (si existen).
- Genera o actualiza un PermissionSet agregado.
Este PermissionSet agregado:
- Es un registro distinto en PermissionSet.
- Tiene PermissionSetGroupId != null.
- Es referenciado en PermissionSetGroupAssignment.PermissionSetId.
- Es el que realmente evalúa el motor de seguridad.
4 Asignación de Permisos a Usuarios
Los permisos nunca se asignan directamente al usuario.
Siempre se asignan mediante estructuras intermedias.
Existen dos mecanismos:
- Asignación directa de Permission Sets
- Asignación mediante Permission Set Groups
Ambos mecanismos son acumulativos.
4.1 Asignación Directa de Permission Sets
4.1.1 PermissionSetAssignment
API Name: PermissionSetAssignment
Une usuarios con PermissionSets. Cada registro representa una asignación explícita de un PermissionSet al usuario.
Campos principales
- AssigneeId (UserId)
- PermissionSetId
Relación
User (1) —— (N) PermissionSetAssignment —— (1) PermissionSet
Es la forma más simple y directa de extender permisos más allá del Profile.
4.2 Asignación Mediante Permission Set Groups
Este mecanismo introduce una capa de abstracción orientada a gobernanza y escalabilidad.
4.2.1 PermissionSetGroup
API Name: PermissionSetGroup
Es un contenedor lógico de múltiples PermissionSets.
Características
- No almacena permisos directamente.
- Permite gestionar permisos por rol funcional o dominio.
- Reduce asignaciones manuales masivas.
Campos principales
- DeveloperName
- Status
4.2.2 PermissionSetGroupComponent
API Name: PermissionSetGroupComponent
Define la composición interna del grupo.
Campos principales
- PermissionSetGroupId
- PermissionSetId
Relación
PermissionSetGroup (1) —— (N) PermissionSetGroupComponent —— (1) PermissionSet
Cada registro indica que un PermissionSet forma parte del grupo.
Es la capa estructural que conecta agrupación con permisos reales.
4.2.3 PermissionSetGroupAssignment
API Name: PermissionSetGroupAssignment
Denine la asignacion del grupo a al usuario
Campo importantes
- AssigneeId(User)
- IsActive
- PermissionSetGroupId
- PermissionSetId - *Es un PermissionSet consolidado, generado por el sistema
Relacion
User (1) —— (N) PermissionSetGroupAssignment —— (1) PermissionSetGroup
Cada registro indica que el usuario está vinculado al Permission Set consolidado generado por el sistema para ese grupo, el cual representa la suma efectiva de todos los PermissionSets contenidos en el Permission Set Group.
Importante:
- No puede mezclar Permission Sets creados bajo distintas User Licenses.
- Por lo tanto, el Permission Set agregado generado por el sistema siempre será compatible con la misma User License(Esto lo veremos mas adelante).
5 Licenciamiento
El modelo de licenciamiento en Salesforce define el marco dentro del cual pueden otorgarse permisos.
La licencia no otorga permisos directamente. Define el límite superior de lo que un usuario puede llegar a tener.
5.1 User License
ApiName: UserLicense
La User License define el tipo de usuario y el conjunto máximo de capacidades disponibles.
- Es obligatoria
- Define el tipo de usuario
- Se asigna mediante el Profile
- Es el límite superior del modelo
Ejemplos:
- Salesforce
- Salesforce Platform
- Identity
- Customer Community
- Partner Community
La User License determina:
- Qué objetos estándar están disponibles
- Qué funcionalidades pueden usarse
- Qué perfiles pueden crearse
- Qué Permission Sets pueden asignarse
Relación estructural:
User
└── Profile
└── UserLicense
Todos los Profiles tienen obligatoriamente una User License. Por lo tanto, todo usuario tiene una User License definida por su Profile.
Sin una User License válida, el usuario no puede existir.
5.2 Permission set license (PSL)
ApiName: PermissionSetLicense
Un Permission Set License es una licencia adicional y opcional que habilita funcionalidades específicas.
No define el tipo de usuario. Habilita features avanzadas o add-ons.
Ejemplos:
- CPQ
- Knowledge
- Inbox
- Field Service
- Service Cloud Voice
Relación estructural:
User
└── PermissionSetLicenseAssign
└── PermissionSetLicense
Se asigna directamente al usuario por medio del objeto PermissionSetLicenseAssign
Un usuario debe tener asignada la PSL antes de poder recibir un Permission Set que dependa de esa PSL.
5.3 Objeto PermissionSet
El objeto PermissionSet es una entidad polimórfica. Un registro en PermissionSet puede representar:
- Un Profile
- Un Permission Set independiente
- Un Permission Set agregado de un Permission Set Group
- Un Muting Permission Set
Los campos de licencia definidos en PermissionSet aplican al registro específico, independientemente de su rol lógico.
Este campo LicenseId un lookup polimórfico que puede referenciar a:
• UserLicense • PermissionSetLicense
El objeto PermissionSet puede tener dos tipos de restricciones relacionadas con licenciamiento:
- Restricción por User License
- Restricción por Permission Set License (PSL)
Este único campo modela las restricciones de licenciamiento del PermissionSet.
Dependiendo del tipo de registro que represente el PermissionSet, el comportamiento de LicenseId cambia.
5.3.1 Restricción por User License
Cuando LicenseId apunta a un registro de UserLicense:
- Define compatibilidad con el tipo de usuario.
- Controla qué usuarios pueden recibir ese PermissionSet.
Un PermissionSet solo puede asignarse si:
User.Profile.UserLicenseIdes compatible conPermissionSet.LicenseId
Comportamiento según tipo de registro:
- Cuando el PermissionSet representa un Profile:
PermissionSet.LicenseId = Profile.UserLicenseId. - Si es un Permission Set independiente (sin PSL):
LicenseIdindica con qué UserLicense puede asignarse. - El Permission Set agregado (consolidado) mantiene el mismo
LicenseId(UserLicense) que los Permission Sets componentes del grupo. Salesforce no permite mezclar licencias incompatibles dentro de un mismo Permission Set Group. - El Muting Permission Set también está asociado al mismo UserLicense que el Group al que pertenece.
En todos estos casos, LicenseId actúa como restricción de compatibilidad base.
5.3.2 Restricción por Permission Set License (PSL)
Cuando LicenseId apunta a un registro de PermissionSetLicense:
- El PermissionSet requiere una PSL específica.
- Funciona como dependencia de add-on.
- El usuario debe tener asignada esa PSL mediante PermissionSetLicenseAssign.
Regla:
Si PermissionSet.LicenseId referencia a un PermissionSetLicense, el usuario debe tener esa PSL asignada antes de recibir el PermissionSet.
- Si no la tiene, Salesforce no permite asignar el PermissionSet.
- Aplica únicamente a:
- Permission Sets independientes creados manualmente
- Permission Sets gestionados por paquetes
- Permission Sets estándar del sistema
Permission Set consolidado por el sistema
El Permission Set agregado o consolidado generado por el sistema:
- Mantiene LicenseId apuntando a UserLicense.
- No apunta a PermissionSetLicense.
- No consolida múltiples PSL.
- No declara dependencia propia de PSL.
Si un Permission Set Group contiene componentes cuyo LicenseId apunta a PermissionSetLicense:
- Salesforce valida la dependencia de PSL sobre cada componente individual.
- La validación ocurre antes de generar o evaluar el Permission Set agregado.
- El Permission Set agregado no participa en la validación de PSL.
5.2.3 Modelo de Validación Completo
Al asignar un PermissionSet a un usuario, Salesforce valida el campo LicenseId. El comportamiento depende del tipo de registro al que apunte:
- Si LicenseId apunta a UserLicense → Se valida que el Profile.UserLicenseId del usuario sea compatible.
- Si LicenseId apunta a PermissionSetLicense → Se valida que el usuario tenga asignada esa PSL mediante PermissionSetLicenseAssign.
Estas validaciones son automáticas y previas a la asignación.
En el caso de Permission Set Groups, la validación se realiza sobre los Permission Sets componentes antes de consolidar el Permission Set agregado.
6. Modelo Consolidado de Relaciones
User
├── Profile
│ ├── UserLicense
│ └── PermissionSet (IsOwnedByProfile = true)
│ ├── LicenseId → UserLicense
│ ├── ObjectPermissions
│ ├── FieldPermissions
│ └── System Permissions
│
├── PermissionSetAssignment
│ └── PermissionSet (independiente)
│ ├── LicenseId → (UserLicense o PermissionSetLicense)
│ ├── ObjectPermissions
│ ├── FieldPermissions
│ └── System Permissions
│
├── PermissionSetGroupAssignment
│ ├── PermissionSetGroup
│ │ ├── PermissionSetGroupComponent
│ │ │ └── PermissionSet (componentes existentes)
│ │ │ ├── LicenseId → (UserLicense o PermissionSetLicense)
│ │ │
│ │ └── Muting PermissionSet
│ │ ├── PermissionSetGroupId != null
│ │ └── LicenseId → UserLicense
│ │
│ └── PermissionSet (Agregado generado por sistema)
│ ├── LicenseId → UserLicense
│ └── Evaluado por el motor de seguridad
│
└── PermissionSetLicenseAssign
└── PermissionSetLicense (PSL)
7. Evaluación de Permisos Efectivos
El acceso efectivo es acumulativo.
- User License define el universo base.
- Permission Set License habilita funcionalidades adicionales.
- PermissionSets otorgan permisos dentro del marco permitido.
- Permission Set Groups consolidan permisos.
- El motor evalúa PermissionSets.
- CRUD y FLS determinan acceso estructural.
- Sharing determina acceso a registros.
- Restriction Rules pueden reducir visibilidad.
Claves del modelo:
- Profile es técnicamente un PermissionSet especial
- Todo permiso estructural vive en PermissionSet
- User nunca almacena permisos directamente
- Los Permission Set Groups son una capa de gobernanza, no de permisos.
- Los Permission Set Groups no agregan lógica adicional por sí mismos.
- Los permisos nunca se restan (excepto con mecanismos específicos como Restriction Rules o Muting en PSG).
- El resultado final es la suma de todos los permisos otorgados.
- Record-level security es independiente de CRUD y FLS
- La evaluación ocurre en capas secuenciales
User
↓
Profile
↓
UserLicense (define universo base)
↓
PermissionSet.LicenseId compatible
↓
Si existe PermissionSetLicenseId
↓
Usuario debe tener PermissionSetLicenseAssign
↓
Motor evalúa PermissionSets
↓
CRUD → FLS → Sharing → Restriction Rules
Conclusión
El modelo de permisos en Salesforce está diseñado bajo:
- Separación entre definición de permisos y asignación
- Modelo acumulativo
- Evaluación por capas
- Abstracción para escalabilidad (Permission Set Groups)
- Comprender el schema real permite:
Diseñar arquitecturas escalables
- Realizar auditorías precisas
- Resolver problemas de acceso complejos
- Evitar anti‑patterns en seguridad