Implementing Authorization

1. Implementing Role-Based Access Control

ComponentExample
Rolesadmin, editor, viewer
Permissions per roleStatic mapping
User → RolesMany-to-many
ProsSimple, easy to audit
ConsRole explosion at scale

2. Implementing Attribute-Based Access Control

ComponentExample
Subject attrsrole, department, clearance
Resource attrsowner, classification, region
Actionread, write, delete
Environmenttime, IP, MFA status
EnginesOPA, Cedar, Casbin

3. Implementing Resource-Level Permissions

Example: Resource-Level Check

@PreAuthorize("@orderSecurity.canAccess(authentication, #orderId)")
@GetMapping("/orders/{orderId}")
public Order getOrder(@PathVariable Long orderId) {
    return orderService.findById(orderId);
}

4. Implementing Scope-Based Authorization

ScopePermits
orders:readGET on orders
orders:writePOST/PUT/PATCH on orders
orders:deleteDELETE on orders
admin:*Full admin access

5. Validating Permissions Before Operations

LayerCheck
GatewayCoarse: scope, role
ControllerEndpoint-level annotation
ServiceBusiness rules, ownership
DataRow-level security (filter at query)

6. Handling Forbidden Access

StatusWhen
401Not authenticated
403Authenticated but not allowed
404Hide existence (sensitive resources)

7. Implementing Owner-Based Access Control

Example: Owner Check

public Order findOrderForUser(Long orderId, Long userId) {
    Order order = repo.findById(orderId)
        .orElseThrow(() -> new NotFoundException());
    if (!order.getUserId().equals(userId)) {
        throw new ForbiddenException();
    }
    return order;
}

8. Implementing Hierarchical Permissions

HierarchyExample
Org → Team → UserOrg admin sees all team data
Folder → FilePermissions inherited from parent
Tenant → WorkspaceTenant admin manages all workspaces

9. Implementing Fine-Grained Permissions

ToolModel
Google Zanzibar / SpiceDBRelationship-based (ReBAC)
Open Policy Agent (OPA)Policy-as-code (Rego)
AWS CedarDeclarative policy language
CasbinMulti-model (RBAC, ABAC)

10. Caching Authorization Decisions

StrategyTrade-off
Cache permission lookupsFaster; staleness on revoke
Short TTL (1-5 min)Limits stale-window
Push invalidationReal-time; complexity
Cache per user+resourceGranular but memory-heavy