ACLs in ServiceNow: A Developer's Complete Guide to Access Control

Access Control Lists (ACLs) are the primary security mechanism in ServiceNow. They control who can read, write, create, and delete records — and when improperly configured, they cause confusing access issues that are hard to diagnose. Here is how they actually work.

ACL types

  • Record (table) — controls access to an entire table or specific records
  • Field — controls access to a specific field on a table
  • UI Action — controls visibility of buttons and menu items
  • Business Rule — rarely used directly for access control

ACL operations

Each ACL is associated with an operation:

  • read — can the user see this record/field?
  • write — can the user modify this field?
  • create — can the user create records on this table?
  • delete — can the user delete records on this table?

How ACLs are evaluated

When a user tries to access a record, ServiceNow evaluates all applicable ACLs in order of specificity. More specific ACLs (table.field) override less specific ones (table.*).

An ACL passes if: the user has the required role AND the condition script returns true. If no ACL matches, access is denied by default.

Script ACLs

For dynamic access control, use the Script field on the ACL. Return true to grant access, false to deny:

// Grant access only if assigned to current user
answer = (current.assigned_to == gs.getUserID());

// Grant access if user has role OR is the caller
answer = gs.hasRole('itil') || (current.caller_id == gs.getUserID());

Elevated privilege ACLs

Roles with "Elevated privilege" require the user to explicitly elevate (re-authenticate) before the role grants access. Used for admin-level operations that require conscious intent.

Debugging ACL issues

Navigate to System Security > Access Control (ACL) and use the Security Policy Check page to test whether a specific user can access a specific table/field. Always check here before assuming a display issue is a UI problem.

Common mistakes

Mistake: Creating an ACL on a table with a script that queries another table — this can cause circular queries and performance issues. Keep ACL scripts lightweight.

Mistake: Forgetting that field-level ACLs stack with table-level ACLs. A user needs to pass both the table read ACL and the field read ACL to see a field's value.

Want the complete reference?

This article is part of the NowSpectrum knowledge library. Browse all products for cheat sheets, interview prep, and deep-dive reference guides.

Browse All Products →