Ir al contenido

Seguridad

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 SetAudienciaCapacidades
FTS_App_AccessAdministradoresAcceso 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_AccessUsuarios FinalesObjectTeamMember__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:

  1. Administradores del Sistema — siempre permitido
  2. Propietarios de Registros — siempre permitido
  3. Miembros del equipo con rol Manager/Owner — permitido
  4. 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ónVerificación de SeguridadImplementación
Create Team MemberSchema.sObjectType.ObjectTeamMember__c.isCreateable()Aplicado en el controlador
Update Team MemberisUpdateable() + isCurrentUserManager()Acceso elevado (without sharing) después de autorización
Delete Team MemberisDeletable() + isCurrentUserManager()Acceso elevado (without sharing) después de autorización
Read Team MembersWITH USER_MODE / sharing modelRespeta OWD/sharing
EntradaValidaciónUbicación
recordIdNo en blanco, formato de ID de Salesforce válidoControlador
userIdNo en blanco, ID de Usuario válidoControlador
accessLevelNo en blanco, valor de picklist válidoControlador + Picklist
roleNo en blanco, valor de picklist válidoControlador + Picklist
endDateDebe ser fecha futura o nulaControlador + Validation Rule
objectApiNameDerivado del ID de Salesforce (no entrada de usuario)Controlador
ReglaObjetoDescripción
End_Date_Cannot_Be_PastObjectTeamMember__cPreviene 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

Mejores Prácticas de Seguridad Implementadas

Sección titulada «Mejores Prácticas de Seguridad Implementadas»
ControlEstadoImplementación
Verificaciones CRUD en controladoresImplementadoisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Aplicación de FLSImplementadoPermission Sets controlan el acceso a campos
Prevención de inyección SOQLImplementadoVariables de enlace para entrada de usuario, lista blanca para nombres de objetos
Sharing modelImplementadowith sharing en controladores, without sharing solo donde está documentado
Validación de entradaImplementadoVerificaciones de nulo, validación de formato, reglas de negocio
Prevención de XSSImplementadoEl framework LWC maneja la codificación de salida
VerificaciónResultado
Llamadas HTTPNinguna — el paquete no realiza llamadas externas
Named CredentialsNo usado
External ObjectsNo usado
Remote Site SettingsNo requerido
Violaciones CSPAprobado — sin violaciones de Content-Security-Policy