Skip to main content
Version: 2.4

Access Rules

This document describes Access Rules in tSM — an additional layer of data-level security that filters which specific records a user can view or edit, beyond the base privileges granted by their roles.


Overview

While Roles and Privileges control what actions a user can perform (e.g., "view tickets", "edit customers"), Access Rules control which specific records they can access based on dynamic conditions.

Example Use Cases:

  • A user can only view tickets assigned to their department
  • Sales representatives can only edit customers in their region
  • Managers can see all orders, but agents can only see their own
  • Support agents can view tickets in status "Open" or "In Progress", but not "Closed"

Key Concepts

Privileges vs Access Rules

AspectPrivileges (from Roles)Access Rules
ScopeAction-based (what you can do)Data-based (which records you can access)
Example"Can edit customers""Can only edit customers in region X"
EvaluationAt authentication timeAt query time (runtime)
PerformanceFast (cached)Slower (evaluated per query)

Access Rules complement privileges — a user needs both the privilege to perform an action AND must pass the access rule filter to access specific records.


1. Access Rule Structure

Core Attributes

FieldTypeRequiredDescription
idUUIDUnique identifier / primary key in UUID format (auto-generated or UUIDv4). Not displayed to end users.
codeStringYesUnique code for the rule. ASCII characters without spaces, 1-255 characters.
nameStringYesDisplay name, 1-255 characters.
descriptionStringDescription of the value (used as tooltip).
entityNameStringEntity type this rule applies to (e.g., Ticket, Customer).
expressionStringFilter expression (SpEL or SQL-like).
accessRuleEnumAccess type: READ or READ_WRITE. Default: READ.
fullAccessBooleanIf true, grants full access without expression evaluation. Default: false.

Configuration Attributes

FieldTypeDescription
dataTagsList<String>Additional data tags (aka labels) for categorization.
configMapAdditional configuration key-value pairs.
localizationDataLocalizationDataTranslations for attributes (e.g., name, description).

System/Audit Fields

FieldTypeRead-onlyDescription
validityFromDateStart of the validity of the rule.
validityToDateEnd of the validity of the rule.
auditInfoAuditInfoYesStandard audit fields (createdBy, createdAt, updatedBy, updatedAt).

Access Rule Enum

ValueDescription
READFilters which records a user can view (list, detail, search)
READ_WRITEFilters which records a user can edit, update, or delete

Expression Language

Access Rules support SpEL (Spring Expression Language) for complex logic and SQL-like syntax for filtering.


2. Access Types

READ Access

Filters which records a user can view (list, detail, search).

Example:

entityName: Ticket
accessRule: READ
expression: "chars.assignedGroupId in (#user.groupIds)"

Effect: User can only see tickets assigned to groups they belong to.


READ_WRITE Access

Filters which records a user can edit, update, or delete.

Example:

entityName: Customer
accessRule: READ_WRITE
expression: "chars.regionCode == #user.regionCode"

Effect: User can edit only customers in their region.


Full Access Mode

When fullAccess is set to true, the rule grants access without evaluating the expression.

Example:

code: ADMIN_FULL_ACCESS
entityName: "*"
accessRule: READ_WRITE
fullAccess: true

Effect: User has unrestricted access to all records of all entity types.


Combined Rules

A user can have multiple rules for the same entity:

  • One READ rule (defines what they can see)
  • One READ_WRITE rule (defines what they can edit)

Example Scenario:

# Rule 1: Can view all tickets in their department
entityName: Ticket
accessRule: READ
expression: "chars.departmentCode == #user.chars['departmentCode']"

# Rule 2: Can only edit tickets assigned to them
entityName: Ticket
accessRule: READ_WRITE
expression: "chars.assignedUserId == #user.id"

Result: User sees all department tickets but can only edit their own.


3. Evaluation Logic

When multiple access rules apply to the same entity for a user:

  1. For READ access:
    • Apply all READ rules with OR logic
    • User sees records matching ANY rule
  2. For READ_WRITE access:
    • Apply all READ_WRITE rules with OR logic
    • User can edit records matching ANY rule

Example:

# Rule 1
expression: "chars.assignedGroupId in myUserGroup()"

# Rule 2
expression: "chars.createdBy = currentUser()"

Result: User sees records from BOTH rules (group assignments OR own created records).


5. Configuration Examples

Example 1: Regional Sales Access

Scenario: Sales reps can only access customers and orders in their assigned region.

# Access Rule: Regional Customer Access
code: REGIONAL_CUSTOMER_ACCESS
entityName: Customer
accessRule: READ_WRITE
expression: "chars.regionCode = 'SOUTH_BOHEMIA'"

Example 2: Support Tier System

Scenario:

  • Tier 1 agents see tickets assigned to them
  • Tier 2 agents see all tickets in their group
  • Managers see all tickets in their department
# Tier 1: Own tickets only
code: TIER1_TICKET_ACCESS
entityName: Ticket
accessRule: READ_WRITE
expression: "chars.assignedUserId == currentUser()"

# Tier 2: Group tickets
code: TIER2_TICKET_ACCESS
entityName: Ticket
accessRule: READ_WRITE
expression: "chars.assignedGroupId in myUserGroup()"

# Managers: Department tickets
code: MANAGER_TICKET_ACCESS
entityName: Ticket
accessRule: READ_WRITE
expression: "chars.departmentCode == 'L2_SUPPORT'"

Example 4: Full Access for Admins

Scenario: Admin users have unrestricted access to all entities.

code: ADMIN_FULL_ACCESS
entityName: "*"
accessRule: READ_WRITE
fullAccess: true

5. Performance Considerations

5.1 Impact on Queries

Access Rules are translated to WHERE clauses and applied at query time. The performance impact varies based on the underlying data store.

Without Access Rule:

SELECT * FROM tickets WHERE status = 'Open'

With Access Rule:

SELECT * FROM tickets 
WHERE status = 'Open'
AND chars.assignedGroupId IN myUserGroup()

The filter is automatically translated based on the entity's storage backend:

  • Elasticsearch — Converted to Elasticsearch Query DSL
  • SQL Database — Applied as SQL WHERE clause

5.2 Performance Characteristics by Storage Type

Elasticsearch Queries

Advantages:

  • Full-text search capabilities
  • Fast filtering on indexed fields
  • Efficient aggregations
  • Scales horizontally

Performance Tips:

  • Use indexed fields in expressions
  • Avoid script-based filters when possible
  • Leverage term queries over wildcard queries
  • Use filters (cached) instead of queries when possible

Example - Efficient:

expression: "chars.status == 'OPEN'"  # Term query, fast

Example - Less Efficient:

expression: "chars.description.contains('urgent')"  # Full-text search, slower

SQL Database Queries

Advantages:

  • Strong consistency guarantees
  • Complex joins supported
  • ACID transactions

Performance Challenges:

  • Can be slow on large datasets without proper indexes
  • Complex expressions may prevent index usage
  • JOIN operations can be expensive

Critical: Always add database indexes for fields used in access rule expressions.