advanced

Policy-based и multi-tenant authorization

Держите authorization decisions рядом с protected resources, централизуйте reusable policy и предотвращайте tenant data leaks через scoped queries и tests.

Multi-tenant SaaS должен ограничивать каждый query и mutation по tenant ID из доверенного auth context — не из непроверенного body. Policy engines (OPA, Cedar, custom DSL) централизуют rules, services enforce рядом с данными.

					async function listOrders(user) {
  return db.orders.findMany({
    where: { tenantId: user.tenantId },
  });
}

if (!policy.allow(user, 'invoice:send', invoice)) {
  throw forbidden('POLICY_DENIED');
}
				

Row-level security в PostgreSQL — backstop на уровне БД. Integration tests включают cross-tenant попытки, которые должны падать.

На интервью: слои tenant isolation (app, ORM scopes, RLS); внешний policy vs inline; blast-radius бага policy.

Типовые ошибки: tenant ID в JWT без проверки membership; общие cache keys; background jobs без tenant context.

Чеклист:

  • Tenant только из authenticated identity.
  • Scope ORM и cache keys по tenant.
  • Negative cross-tenant tests в CI.
  • Версионирование и аудит изменений policy.