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.