flowchart LR
subgraph PS["PERMISSION SETS"]
subgraph ADMIN["FTS_App_Access<br/>(Administrators)"]
A1["App: FlexibleTeamShare"]
A2["Tabs: All visible"]
A3["Apex: All classes"]
A4["Objects: Full CRUD + MAR"]
A5["Team_Sharing_Config: CRUD"]
end
subgraph USER["FTS_Data_Access<br/>(End Users)"]
U1["ObjectTeamMember__c: CRUD"]
U2["Team_Sharing_Config__c: Read"]
U3["Apex: Controller only"]
U4["No View/Modify All Records"]
end
end
| Permission Set | Audiencia | Capacidades |
|---|
| FTS_App_Access | Administradores | Acceso completo a la aplicación, todas las pestañas, todas las clases Apex, CRUD completo + Modify All Records en objetos, Team_Sharing_Config CRUD |
| FTS_Data_Access | Usuarios Finales | ObjectTeamMember__c CRUD, Team_Sharing_Config__c Read, solo clases Apex de controlador, sin View/Modify All Records |
flowchart TB
START["¿Quién puede gestionar<br/>miembros del equipo?"] --> CHECK1{"¿Administrador<br/>del Sistema?"}
CHECK1 -->|Sí| ALLOWED["PERMITIDO"]
CHECK1 -->|No| CHECK2{"¿Propietario<br/>del Registro?"}
CHECK2 -->|Sí| ALLOWED
CHECK2 -->|No| CHECK3{"¿Miembro del Equipo con<br/>Role = Manager<br/>o Owner?"}
CHECK3 -->|Sí| ALLOWED
CHECK3 -->|No| DENIED["DENEGADO"]
El método isCurrentUserManager() determina quién puede gestionar miembros del equipo:
- Administradores del Sistema — siempre permitido
- Propietarios de Registros — siempre permitido
- Miembros del equipo con rol Manager/Owner — permitido
- Todos los demás — denegado
flowchart LR
subgraph CRUD["CRUD/FLS Checks"]
C["Create"] --> C1["isCreateable()"]
U["Update"] --> U1["isUpdateable() +<br/>isCurrentUserManager()"]
D["Delete"] --> D1["isDeletable() +<br/>isCurrentUserManager()"]
R["Read"] --> R1["WITH USER_MODE"]
end
subgraph LOC["Execution Mode"]
L1["Enforced in Controller"]
L2["Elevated Access<br/>(without sharing)"]
L3["Respects OWD/Sharing"]
end
C1 --> L1
U1 --> L2
D1 --> L2
R1 --> L3
| Operación | Verificación de Seguridad | Implementación |
|---|
| Create Team Member | Schema.sObjectType.ObjectTeamMember__c.isCreateable() | Aplicado en el controlador |
| Update Team Member | isUpdateable() + isCurrentUserManager() | Acceso elevado (without sharing) después de autorización |
| Delete Team Member | isDeletable() + isCurrentUserManager() | Acceso elevado (without sharing) después de autorización |
| Read Team Members | WITH USER_MODE / sharing model | Respeta OWD/sharing |
| Entrada | Validación | Ubicación |
|---|
recordId | No en blanco, formato de ID de Salesforce válido | Controlador |
userId | No en blanco, ID de Usuario válido | Controlador |
accessLevel | No en blanco, valor de picklist válido | Controlador + Picklist |
role | No en blanco, valor de picklist válido | Controlador + Picklist |
endDate | Debe ser fecha futura o nula | Controlador + Validation Rule |
objectApiName | Derivado del ID de Salesforce (no entrada de usuario) | Controlador |
| Regla | Objeto | Descripción |
|---|
End_Date_Cannot_Be_Past | ObjectTeamMember__c | Previene establecer fecha de finalización en el pasado |
flowchart LR
subgraph INPUT["ObjectTeamMember__c<br/>Access_Level__c"]
I1["Read Only"]
I2["Read/Write"]
end
subgraph OUTPUT["[Object]Share<br/>AccessLevel"]
O1["Read"]
O2["Edit"]
end
I1 --> O1
I2 --> O2
flowchart TB
subgraph PERM["Permission Sets"]
PS1["FTS_App_Access<br/>Administrators"]
PS2["FTS_Data_Access<br/>End Users"]
end
subgraph ACCESS["Access Control"]
AC1["System Admin"]
AC2["Record Owner"]
AC3["Manager/Owner Role"]
end
subgraph SHARE["Sharing Model"]
SH1["ObjectTeamMember__Share"]
SH2["[Object]Share"]
end
subgraph LEVELS["Access Levels"]
LV1["Read Only → Read"]
LV2["Read/Write → Edit"]
end
PERM --> ACCESS
ACCESS --> SHARE
SHARE --> LEVELS
| Control | Estado | Implementación |
|---|
| Verificaciones CRUD en controladores | Implementado | isAccessible(), isCreateable(), isUpdateable(), isDeletable() |
| Aplicación de FLS | Implementado | Permission Sets controlan el acceso a campos |
| Prevención de inyección SOQL | Implementado | Variables de enlace para entrada de usuario, lista blanca para nombres de objetos |
| Sharing model | Implementado | with sharing en controladores, without sharing solo donde está documentado |
| Validación de entrada | Implementado | Verificaciones de nulo, validación de formato, reglas de negocio |
| Prevención de XSS | Implementado | El framework LWC maneja la codificación de salida |
| Verificación | Resultado |
|---|
| Llamadas HTTP | Ninguna — el paquete no realiza llamadas externas |
| Named Credentials | No usado |
| External Objects | No usado |
| Remote Site Settings | No requerido |
| Violaciones CSP | Aprobado — sin violaciones de Content-Security-Policy |