Przejdź do głównej zawartości

Security

This content is for the 1.0 version. Switch to the latest version for up-to-date documentation.

Ta treść nie jest jeszcze dostępna w Twoim języku.

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 SetAudienceCapabilities
FTS_App_AccessAdministratorsFull app access, all tabs, all Apex classes, full CRUD + Modify All Records on objects, Team_Sharing_Config CRUD
FTS_Data_AccessEnd UsersObjectTeamMember__c CRUD, Team_Sharing_Config__c Read, controller Apex classes only, no 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"]

The isCurrentUserManager() method determines who can manage team members:

  1. System Administrators — always allowed
  2. Record Owners — always allowed
  3. Manager/Owner role team members — allowed
  4. Everyone else — denied
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
OperationSecurity CheckImplementation
Create Team MemberSchema.sObjectType.ObjectTeamMember__c.isCreateable()Enforced in controller
Update Team MemberisUpdateable() + isCurrentUserManager()Elevated access (without sharing) after authorization
Delete Team MemberisDeletable() + isCurrentUserManager()Elevated access (without sharing) after authorization
Read Team MembersWITH USER_MODE / sharing modelRespects OWD/sharing
InputValidationLocation
recordIdNot blank, valid Salesforce ID formatController
userIdNot blank, valid User IDController
accessLevelNot blank, valid picklist valueController + Picklist
roleNot blank, valid picklist valueController + Picklist
endDateMust be future date or nullController + Validation Rule
objectApiNameDerived from Salesforce ID (not user input)Controller
RuleObjectDescription
End_Date_Cannot_Be_PastObjectTeamMember__cPrevents setting end date in the past
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
ControlStatusImplementation
CRUD checks in controllersImplementedisAccessible(), isCreateable(), isUpdateable(), isDeletable()
FLS enforcementImplementedPermission Sets control field access
SOQL injection preventionImplementedBind variables for user input, whitelist for object names
Sharing modelImplementedwith sharing on controllers, without sharing only where documented
Input validationImplementedNull checks, format validation, business rules
XSS preventionImplementedLWC framework handles output encoding
CheckResult
HTTP CalloutsNone — package makes no external calls
Named CredentialsNot used
External ObjectsNot used
Remote Site SettingsNot required
CSP ViolationsPass — no Content-Security-Policy violations