Skip to content

Field & Object Security: Profiles, Permission Sets & FLS

Field and object security controls what users can do with data — which objects they can access, which fields they can see, and what CRUD operations they can perform. While the sharing model controls which records a user can see, field and object security controls what they can do with those records.

flowchart LR
    subgraph "Record Access (Which records?)"
        OWD["OWD"]
        RH["Role Hierarchy"]
        SR["Sharing Rules"]
    end

    subgraph "Object & Field Access (What can they do?)"
        Profile["Profile"]
        PS["Permission Sets"]
        PSG["Permission Set Groups"]
        FLS["Field-Level Security"]
    end

    OWD --> Profile
    RH --> PS
    SR --> PSG

    Profile --> FLS
    PS --> FLS
    PSG --> FLS

    style Profile fill:#1565c0,color:#fff
    style PS fill:#2e7d32,color:#fff
    style PSG fill:#e65100,color:#fff

Profiles

A Profile is the baseline permission assignment for a user. Every user must have exactly one Profile.

What Profiles Control

CategoryPermissions
Object permissionsCreate, Read, Edit, Delete, View All, Modify All
Field-level securityVisible, Read Only, Hidden per field per object
Tab visibilityDefault On, Default Off, Hidden
App visibilityWhich Lightning apps are visible
Record typesWhich record types are available + default
Page layoutsWhich page layout to display per record type
Login hoursWhen the user can log in
Login IP rangesWhere the user can log in from
System permissionsAPI Enabled, Author Apex, Manage Users, etc.
Apex class accessWhich Apex classes are executable
Visualforce page accessWhich VF pages are accessible
Connected App accessWhich Connected Apps are available

The Minimum Access Profile Pattern

CTA Best Practice: Minimum Access Profile

The recommended pattern for enterprise Salesforce is to create a Minimum Access Profile (or use the built-in “Minimum Access - Salesforce” profile) that grants almost nothing, then layer permissions using Permission Sets. This is analogous to starting with Private OWD for sharing.

Why minimum access profiles?

Traditional ApproachMinimum Access + Permission Sets
Multiple profiles (one per role)One or few base profiles
Hard to audit — permissions scattered across profilesEasy to audit — each Permission Set has a clear purpose
Profile cloning creates driftPermission Sets are reusable building blocks
Changing a profile affects all assigned usersPermission Sets can be assigned selectively
Cannot assign multiple profilesCan stack multiple Permission Sets
1,500 profile limit (Unlimited Edition)1,000 Permission Sets + groups

Standard vs Custom Profiles

FeatureStandard ProfilesCustom Profiles
Object permissionsCannot reduce below standardFully configurable
FLSCan restrict (since Spring ‘23)Fully configurable
System permissionsFixedConfigurable
DeletableNoYes (if no users assigned)
EditableLimitedFull
RecommendationAvoid for real implementationsAlways use custom profiles

Standard Profile Trap

Standard profiles (like “Standard User”) have built-in permissions that cannot be removed. You cannot, for example, remove Read access to Accounts from the Standard User profile. This makes standard profiles unsuitable for minimum access architectures. Always create custom profiles.

Permission Sets

Permission Sets add permissions on top of the Profile baseline. They are the primary mechanism for granting granular access in modern Salesforce architectures.

Permission Set Design Principles

  1. One concern per Permission Set — “Sales: Create Quotes” not “Sales User Everything”
  2. Name descriptively — include the functional area and the permission being granted
  3. Never duplicate Profile permissions — Permission Sets are additive
  4. Group logically — use Permission Set Groups to bundle related sets
  5. Document the purpose — every Permission Set should have a clear description

Permission Set Categories

CategoryExampleGranularity
Function-based”Sales: Create Opportunities”Fine — one business function
Feature-based”Einstein Analytics User”Medium — access to a platform feature
Role-based”Regional Manager Permissions”Broad — use Permission Set Groups instead
Integration-based”API: Order Sync Service”Fine — specific integration needs
Temporary”Q4 Promotion Campaign Access”Time-limited (use session-based or assignment expiration)

Permission Set Assignment

MethodUse CaseAutomation
Manual assignmentAd hoc, small scaleNone — admin assigns via Setup
Assignment via groupRole-based bulk assignmentAssign Permission Set Group to users
Flow-based assignmentDynamic, event-drivenFlow assigns/removes based on criteria
Apex-based assignmentIntegration-drivenCode assigns during user provisioning
Permission Set Assignment ExpirationTemporary accessAuto-expires after specified date

Permission Set Groups

Permission Set Groups bundle multiple Permission Sets into a single assignable unit. They represent a “role” in the permission model.

Permission Set Group Architecture

flowchart TD
    subgraph "Permission Set Group: Sales Manager"
        PSG["Permission Set Group"]
        PS1["PS: Read Accounts"]
        PS2["PS: Read/Write Opportunities"]
        PS3["PS: Read/Write Quotes"]
        PS4["PS: Run Sales Reports"]
        PS5["PS: View Forecasts"]
        MPS["Muting PS: Block Delete Opp"]
    end

    PSG --> PS1
    PSG --> PS2
    PSG --> PS3
    PSG --> PS4
    PSG --> PS5
    PSG -.->|"Mutes"| MPS

    User["User with\nMinimum Access Profile"] --> PSG

    style PSG fill:#1565c0,color:#fff
    style MPS fill:#c62828,color:#fff
    style User fill:#2e7d32,color:#fff

Muting Permission Sets

Muting Permission Sets remove specific permissions from a Permission Set Group without modifying the underlying Permission Sets. This is critical for reuse.

Example: The “Write Opportunities” Permission Set grants Create, Read, Edit, Delete on Opportunities. The Sales Manager group needs everything except Delete. Instead of creating a separate Permission Set, create a Muting Permission Set that blocks Delete.

Without MutingWith Muting
Create “Write Opps No Delete” Permission SetReuse “Write Opps” Permission Set
Duplicate Permission Sets for slight variationsOne muting set per group removes specific permissions
Permission Set sprawlClean, composable architecture

Muting Permission Set Limitations

Muting Permission Sets can only mute permissions within their own Permission Set Group. They cannot mute permissions granted by the user’s Profile or by individually assigned Permission Sets. This reinforces the minimum access profile pattern — if the Profile grants a permission, muting cannot override it.

How Record Access and Object/Field Access Combine

A user must pass BOTH the record-level check AND the object/field-level check to access data. These two layers are evaluated independently and both must grant access.

flowchart TD
    UserRequest["User requests\ndata access"] --> RecordCheck{"Record-Level Access\n(Sharing Model)"}
    RecordCheck -->|"Can see the record?\n(OWD + Hierarchy +\nSharing Rules + etc.)"| ObjCheck{"Object-Level Access\n(Profile + Permission Sets)"}
    RecordCheck -->|"No record access"| Denied1["Access Denied\n(Record not visible)"]

    ObjCheck -->|"Has CRUD on object?"| FieldCheck{"Field-Level Security\n(Profile + Permission Sets)"}
    ObjCheck -->|"No object permission"| Denied2["Access Denied\n(No object permission)"]

    FieldCheck -->|"Field visible?"| Granted["Data Returned\n(Only visible fields)"]
    FieldCheck -->|"Field hidden"| Partial["Record returned\nbut field stripped"]

    style Granted fill:#2e7d32,color:#fff
    style Denied1 fill:#c62828,color:#fff
    style Denied2 fill:#c62828,color:#fff
    style Partial fill:#e65100,color:#fff

CTA Board Framing

When presenting your security architecture, explicitly separate the two layers: “For record visibility, I use Private OWD with criteria-based sharing rules. For object and field access, I use a Minimum Access Profile with Permission Set Groups. These are independent — a user who can see a record via sharing still cannot see fields their FLS hides.”

Object Permissions (CRUD)

Object permissions control Create, Read, Edit, Delete (CRUD) plus two elevated permissions: View All and Modify All.

CRUD + View All / Modify All

PermissionWhat It DoesRequires
CreateInsert new recordsRead
ReadView records (subject to sharing)Nothing
EditUpdate existing recordsRead
DeleteDelete recordsRead + Edit
View AllSee ALL records regardless of sharing modelRead
Modify AllEdit/Delete ALL records + transfer ownership regardless of sharingRead + Edit + Delete

View All / Modify All vs System Admin

CapabilityView AllModify AllSystem Admin
See all records (bypass sharing)YesYesYes
Edit all recordsNoYesYes
Delete all recordsNoYesYes
Transfer record ownershipNoYesYes
Change sharing settingsNoNoYes
Manage object metadataNoNoYes

View All / Modify All Bypass Sharing

View All and Modify All bypass the entire sharing model — OWD, role hierarchy, sharing rules, teams, everything. Use these permissions sparingly and only when genuinely needed (e.g., data stewards, compliance officers, integration users). The CTA board will question any architecture that relies heavily on View All / Modify All.

Field-Level Security (FLS)

FLS controls which fields users can see and edit on an object, independent of object-level permissions.

FLS Settings

SettingUser Can SeeUser Can Edit
Visible + EditableYesYes
Visible + Read OnlyYesNo
HiddenNoNo

FLS vs Page Layouts

This is a critical distinction that CTA candidates must understand:

AspectField-Level SecurityPage Layout
What it controlsData access (API + UI)UI presentation only
Security enforcementYes — enforced at API levelNo — only affects page display
Can user see via API?Only if FLS grants accessAlways (if FLS allows)
Can user see in reports?Only if FLS grants accessYes (if FLS allows)
Assigned viaProfile or Permission SetProfile + Record Type combination
True security boundary?YESNO

Page Layouts Are Not Security

Removing a field from a page layout does NOT prevent users from accessing that field. They can still see it via reports, list views, API queries, and any custom UI. Only FLS controls true field-level access. This is a common mistake that the CTA board specifically tests for.

FLS Best Practices

  1. Default to hidden — only make fields visible when there is a business need
  2. Use Permission Sets for FLS — do not manage FLS on profiles (minimum access pattern)
  3. Audit FLS regularly — field visibility creeps over time
  4. Remember API access — FLS applies to API calls too; integrations need field access
  5. Test with different users — verify FLS enforcement in reports, list views, and API

Tab Visibility

Tab visibility controls whether an object’s tab appears in the app navigation.

SettingBehavior
Default OnTab is visible by default
Default OffTab is available but hidden by default — user can add it
Tab HiddenTab is not available to the user at all

Tab Visibility vs Object Access

Hiding a tab does NOT prevent access to the object’s records. Users can still access records via related lists, search, reports, and direct URLs. Tab visibility is a UI convenience, not a security control.

The Modern Permission Model

The recommended architecture for enterprise Salesforce combines all these elements:

flowchart TD
    subgraph "Foundation"
        MAP["Minimum Access Profile\n(Almost no permissions)"]
    end

    subgraph "Permission Layer"
        PSG1["PSG: Sales Rep"]
        PSG2["PSG: Sales Manager"]
        PSG3["PSG: Service Agent"]
        PSG4["PSG: Integration User"]
    end

    subgraph "Component Permission Sets"
        PS1["PS: Read Accounts"]
        PS2["PS: Write Opportunities"]
        PS3["PS: Read Cases"]
        PS4["PS: Write Cases"]
        PS5["PS: API Access"]
        PS6["PS: Run Reports"]
    end

    subgraph "Muting Layer"
        M1["Mute: No Delete Opp"]
        M2["Mute: No Export Data"]
    end

    MAP --> PSG1
    MAP --> PSG2
    MAP --> PSG3
    MAP --> PSG4

    PSG1 --> PS1
    PSG1 --> PS2
    PSG1 --> PS6

    PSG2 --> PS1
    PSG2 --> PS2
    PSG2 --> PS6
    PSG2 -.-> M1

    PSG3 --> PS1
    PSG3 --> PS3
    PSG3 --> PS4
    PSG3 --> PS6

    PSG4 --> PS1
    PSG4 --> PS5
    PSG4 -.-> M2

    style MAP fill:#c62828,color:#fff
    style PSG1 fill:#1565c0,color:#fff
    style PSG2 fill:#1565c0,color:#fff
    style PSG3 fill:#1565c0,color:#fff
    style PSG4 fill:#1565c0,color:#fff

Sources