Pular para o conteúdo

Segurança

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 SetPúblicoCapacidades
FTS_App_AccessAdministradoresAcesso completo ao aplicativo, todas as abas, todas as classes Apex, CRUD completo + Modify All Records em objetos, Team_Sharing_Config CRUD
FTS_Data_AccessUsuários FinaisObjectTeamMember__c CRUD, Team_Sharing_Config__c Read, apenas classes Apex controller, sem View/Modify All Records
flowchart TB
    START["Who can manage<br/>team members?"] --> CHECK1{"System<br/>Administrator?"}
    CHECK1 -->|Yes| ALLOWED["ALLOWED"]
    CHECK1 -->|No| CHECK2{"Record<br/>Owner?"}
    CHECK2 -->|Yes| ALLOWED
    CHECK2 -->|No| CHECK3{"Team Member with<br/>Role = Manager<br/>or Owner?"}
    CHECK3 -->|Yes| ALLOWED
    CHECK3 -->|No| DENIED["DENIED"]

O método isCurrentUserManager() determina quem pode gerenciar membros da equipe:

  1. System Administrators — sempre permitido
  2. Record Owners — sempre permitido
  3. Membros da equipe com função Manager/Owner — permitido
  4. Todos os outros — negado
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
OperaçãoVerificação de SegurançaImplementação
Create Team MemberSchema.sObjectType.ObjectTeamMember__c.isCreateable()Aplicado no controller
Update Team MemberisUpdateable() + isCurrentUserManager()Acesso elevado (without sharing) após autorização
Delete Team MemberisDeletable() + isCurrentUserManager()Acesso elevado (without sharing) após autorização
Read Team MembersWITH USER_MODE / sharing modelRespeita OWD/sharing
EntradaValidaçãoLocalização
recordIdNão em branco, formato de ID Salesforce válidoController
userIdNão em branco, ID de User válidoController
accessLevelNão em branco, valor de picklist válidoController + Picklist
roleNão em branco, valor de picklist válidoController + Picklist
endDateDeve ser data futura ou nullController + Validation Rule
objectApiNameDerivado do ID Salesforce (não entrada do usuário)Controller
RegraObjetoDescrição
End_Date_Cannot_Be_PastObjectTeamMember__cImpede definir data de término no passado
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
ControleStatusImplementação
Verificações CRUD em controllersImplementadoisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Aplicação FLSImplementadoPermission Sets controlam acesso a campos
Prevenção de injeção SOQLImplementadoBind variables para entrada de usuário, whitelist para nomes de objeto
Sharing modelImplementadowith sharing em controllers, without sharing apenas onde documentado
Validação de entradaImplementadoVerificações null, validação de formato, regras de negócio
Prevenção XSSImplementadoFramework LWC trata codificação de saída
VerificaçãoResultado
HTTP CalloutsNenhum — pacote não faz chamadas externas
Named CredentialsNão usado
External ObjectsNão usado
Remote Site SettingsNão necessário
CSP ViolationsPass — sem violações de Content-Security-Policy