Skip to Content

@ApiAuthorizationPolicy

Registers a class as an authorization policy for a specific entity. Policies execute before every secured CRUD route and can allow/deny requests based on custom logic.

Signature

@ApiAuthorizationPolicy<E extends IApiBaseEntity>({ entity, priority?, policyId?, description?, }: IApiAuthorizationPolicySubscriberProperties<E>)

Options

OptionDescription
cacheOptional cache override for this policy (isEnabled, ttlMs).
entityEntity this policy protects. Required.
priorityHigher priorities execute earlier. Defaults to 0.
policyIdOptional custom identifier. Defaults to <entityName>Policy. Useful when multiple policies protect the same entity.
descriptionShort summary displayed in tooling or logs.

Usage steps

  1. Extend ApiAuthorizationPolicyBase<E> and implement lifecycle hooks (onBeforeCreate, onBeforeGetList, etc.).
  2. Decorate the class with @ApiAuthorizationPolicy.
  3. Import ApiAuthorizationModule so policies are discovered.
  4. Add @ApiControllerSecurable() (and optionally @ApiController) to controllers that should enforce policies.

Example

import type { IApiAuthorizationRuleContext, IApiAuthorizationScope, TApiAuthorizationPolicyBeforeGetListResult, TApiAuthorizationRuleScopeResolver } from "@elsikora/nestjs-crud-automator"; import { ApiAuthorizationPolicy, ApiAuthorizationPolicyBase } from "@elsikora/nestjs-crud-automator"; @Injectable() @ApiAuthorizationPolicy<UserEntity>({ entity: UserEntity, priority: 150, description: "Allow admins and support staff to manage users", }) export class UserAccessPolicy extends ApiAuthorizationPolicyBase<UserEntity> { public onBeforeGetList(): TApiAuthorizationPolicyBeforeGetListResult<UserEntity> { const scope: TApiAuthorizationRuleScopeResolver<UserEntity> = (context: IApiAuthorizationRuleContext<UserEntity>): IApiAuthorizationScope<UserEntity> => ({ where: { ownerId: context.subject.id }, }); return this.allowForRoles(["admin", "support"], { description: "Admins and support can list users", scope, }); } }

Hook context

context.DATA contains typed metadata for the request, including the resolved subject and optional authenticationRequest.

Return type helpers

Use TApiAuthorizationPolicyBefore*Result and TApiAuthorizationPolicyCustomActionResult to make hook return types explicit. Hooks always return arrays of rules; use an empty array ([]) when no rules apply.

Policy cache override

Use the cache option when you want to cache only specific policies:

@ApiAuthorizationPolicy<UserEntity>({ entity: UserEntity, cache: { isEnabled: true, ttlMs: 60_000 }, }) export class UserAccessPolicy extends ApiAuthorizationPolicyBase<UserEntity> {}
Last updated on