Skip to content

Sécurité

Mécanismes de sécurité, modèle de permissions et application CRUD/FLS.

Modèle de permissions

Ensembles de permissions

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 SetAudienceCapacités
FTS_App_AccessAdministrateursAccès complet à l’application, tous les onglets, toutes les classes Apex, CRUD complet + Modify All Records sur les objets, Team_Sharing_Config CRUD
FTS_Data_AccessUtilisateurs finauxObjectTeamMember__c CRUD, Team_Sharing_Config__c Read, classes Apex contrôleur uniquement, aucun View/Modify All Records

Logique de contrôle d’accès

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"]

La méthode isCurrentUserManager() détermine qui peut gérer les membres d’équipe :

  1. System Administrators — toujours autorisés
  2. Record Owners — toujours autorisés
  3. Membres d’équipe avec rôle Manager/Owner — autorisés
  4. Tous les autres — refusés

Application CRUD/FLS

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
OpérationVérification de sécuritéImplémentation
Create Team MemberSchema.sObjectType.ObjectTeamMember__c.isCreateable()Appliqué dans le contrôleur
Update Team MemberisUpdateable() + isCurrentUserManager()Accès élevé (without sharing) après autorisation
Delete Team MemberisDeletable() + isCurrentUserManager()Accès élevé (without sharing) après autorisation
Read Team MembersWITH USER_MODE / sharing modelRespecte OWD/partage

Validation des entrées

EntréeValidationEmplacement
recordIdNon vide, format d’ID Salesforce valideController
userIdNon vide, User ID valideController
accessLevelNon vide, valeur de liste de sélection valideController + Picklist
roleNon vide, valeur de liste de sélection valideController + Picklist
endDateDoit être une date future ou nullController + Validation Rule
objectApiNameDérivé de l’ID Salesforce (pas d’entrée utilisateur)Controller

Règles de validation

RègleObjetDescription
End_Date_Cannot_Be_PastObjectTeamMember__cEmpêche la définition d’une date de fin dans le passé

Mappage des niveaux d’accès

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

Vue d’ensemble complète de la sécurité

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

Meilleures pratiques de sécurité implémentées

ContrôleStatutImplémentation
Vérifications CRUD dans les contrôleursImplémentéisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Application FLSImplémentéLes ensembles de permissions contrôlent l’accès aux champs
Prévention de l’injection SOQLImplémentéVariables liées pour l’entrée utilisateur, liste blanche pour les noms d’objets
Modèle de partageImplémentéwith sharing sur les contrôleurs, without sharing uniquement là où documenté
Validation des entréesImplémentéVérifications null, validation de format, règles métier
Prévention XSSImplémentéLe framework LWC gère l’encodage de sortie

Sécurité de l’intégration externe

VérificationRésultat
HTTP CalloutsAucun — le package ne fait aucun appel externe
Named CredentialsNon utilisé
External ObjectsNon utilisé
Remote Site SettingsNon requis
Violations CSPRéussite — aucune violation Content-Security-Policy