@shield-acl/core
Version:
Sistema ACL (Access Control List) inteligente e granular com algoritmos de permissões
1 lines • 37.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/acl.ts","../src/utils/permission-builder.ts","../src/utils/presets.ts"],"sourcesContent":["import type {\n ACLConfig,\n ACLEngine,\n CacheEntry,\n EvaluationContext,\n EvaluationResult,\n PatternMatcher,\n Permission,\n PermissionAction,\n PermissionRule,\n ResourceType,\n Role,\n RoleName,\n User,\n} from \"./types\";\n\n/**\n * Motor ACL inteligente com suporte a wildcards, cache e herança\n */\nexport class ACL<TContext = any> implements ACLEngine<TContext> {\n private roles: Map<RoleName, Role<TContext>> = new Map();\n private cache: Map<string, CacheEntry> = new Map();\n private config: Required<ACLConfig>;\n private patternMatcher: PatternMatcher;\n\n constructor(config: ACLConfig = {}) {\n this.config = {\n wildcardPattern: \"*\",\n caseSensitive: false,\n cache: true,\n cacheMaxSize: 1000,\n cacheTTL: 5 * 60 * 1000, // 5 minutos\n defaultDeny: true,\n debug: false,\n ...config,\n };\n\n this.patternMatcher = this.createPatternMatcher();\n }\n\n /**\n * Cria um matcher de patterns com suporte a wildcards\n */\n private createPatternMatcher(): PatternMatcher {\n const { wildcardPattern, caseSensitive } = this.config;\n\n return (pattern: string, value: string): boolean => {\n // Normaliza strings se não for case sensitive\n if (!caseSensitive) {\n pattern = pattern.toLowerCase();\n value = value.toLowerCase();\n }\n\n // Wildcard completo\n if (pattern === wildcardPattern) return true;\n\n // Converte pattern para regex\n const regexPattern = pattern\n .split(wildcardPattern)\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(value);\n };\n }\n\n /**\n * Define uma role no sistema\n */\n defineRole(role: Role<TContext>): void {\n this.roles.set(role.name, role);\n this.clearCache(); // Limpa cache ao modificar roles\n }\n\n /**\n * Remove uma role do sistema\n */\n removeRole(name: RoleName): void {\n this.roles.delete(name);\n this.clearCache();\n }\n\n /**\n * Obtém uma role pelo nome\n */\n getRole(name: RoleName): Role<TContext> | undefined {\n return this.roles.get(name);\n }\n\n /**\n * Verifica se usuário tem permissão\n */\n can(\n user: User<TContext>,\n action: PermissionAction,\n resource?: ResourceType,\n context?: TContext,\n ): boolean {\n const result = this.evaluate(user, action, resource, context);\n return result.allowed;\n }\n\n /**\n * Avalia permissão com detalhes\n */\n evaluate(\n user: User<TContext>,\n action: PermissionAction,\n resource?: ResourceType,\n context?: TContext,\n ): EvaluationResult {\n // Verifica cache\n if (this.config.cache) {\n const cached = this.checkCache(user, action, resource, context);\n if (cached) return cached;\n }\n\n // Cria contexto de avaliação\n const evalContext: EvaluationContext = {\n user,\n resource: (context as any)?.resource || resource,\n metadata: { action, resourceType: resource },\n };\n\n // Coleta todas as permissões aplicáveis\n const permissions = this.getUserPermissions(user);\n\n // Ordena por prioridade (maior primeiro) e especificidade\n const sortedPermissions = this.sortPermissions(permissions);\n\n // Avalia cada permissão\n for (const permission of sortedPermissions) {\n const matches = this.matchesPermission(\n permission,\n action,\n evalContext,\n context,\n resource,\n );\n\n if (matches) {\n const result: EvaluationResult = {\n allowed: !permission.deny,\n reason: permission.deny\n ? `Explicitly denied by rule: ${this.formatRule(permission)}`\n : `Allowed by rule: ${this.formatRule(permission)}`,\n matchedRule: permission,\n };\n\n // Salva no cache\n if (this.config.cache) {\n this.saveToCache(user, action, resource, result, context);\n }\n\n return result;\n }\n }\n\n // Sem match - usa default\n const result: EvaluationResult = {\n allowed: !this.config.defaultDeny,\n reason: this.config.defaultDeny\n ? \"No matching permission found (default deny)\"\n : \"No matching permission found (default allow)\",\n };\n\n if (this.config.cache) {\n this.saveToCache(user, action, resource, result, context);\n }\n\n return result;\n }\n\n /**\n * Obtém todas as permissões de um usuário (incluindo roles)\n */\n getUserPermissions(user: User<TContext>): PermissionRule<TContext>[] {\n const permissions: PermissionRule<TContext>[] = [];\n\n // Permissões diretas do usuário\n if (user.permissions) {\n permissions.push(...user.permissions);\n }\n\n // Permissões das roles (com herança)\n const processedRoles = new Set<RoleName>();\n\n for (const roleName of user.roles) {\n this.collectRolePermissions(roleName, permissions, processedRoles);\n }\n\n return permissions;\n }\n\n /**\n * Coleta permissões de uma role recursivamente (herança)\n */\n private collectRolePermissions(\n roleName: RoleName,\n permissions: PermissionRule<TContext>[],\n processedRoles: Set<RoleName>,\n ): void {\n if (processedRoles.has(roleName)) return;\n processedRoles.add(roleName);\n\n const role = this.roles.get(roleName);\n if (!role) return;\n\n // Adiciona permissões da role\n permissions.push(...role.permissions);\n\n // Processa roles herdadas\n if (role.inherits) {\n for (const inheritedRole of role.inherits) {\n this.collectRolePermissions(inheritedRole, permissions, processedRoles);\n }\n }\n }\n\n /**\n * Obtém hierarquia completa de uma role\n */\n getRoleHierarchy(roleName: RoleName): RoleName[] {\n const hierarchy: RoleName[] = [];\n const processedRoles = new Set<RoleName>();\n\n const collectHierarchy = (name: RoleName) => {\n if (processedRoles.has(name)) return;\n processedRoles.add(name);\n\n const role = this.roles.get(name);\n if (!role) return;\n\n hierarchy.push(name);\n\n if (role.inherits) {\n for (const inheritedRole of role.inherits) {\n collectHierarchy(inheritedRole);\n }\n }\n };\n\n collectHierarchy(roleName);\n return hierarchy;\n }\n\n /**\n * Verifica se uma permissão corresponde à ação/recurso\n */\n private matchesPermission(\n permission: PermissionRule<TContext>,\n action: PermissionAction,\n evalContext: EvaluationContext,\n context?: TContext,\n resource?: ResourceType,\n ): boolean {\n // Verifica ação\n const actions = Array.isArray(permission.action)\n ? permission.action\n : [permission.action];\n\n const actionMatches = actions.some((a) => this.patternMatcher(a, action));\n\n if (!actionMatches) return false;\n\n // Verifica recurso (se especificado)\n if (permission.resource) {\n if (!resource) return false;\n\n const resources = Array.isArray(permission.resource)\n ? permission.resource\n : [permission.resource];\n\n const resourceMatches = resources.some((r) =>\n this.patternMatcher(r, resource),\n );\n\n if (!resourceMatches) return false;\n }\n\n // Verifica condições\n if (permission.conditions && permission.conditions.length > 0) {\n // Se context customizado foi passado, usa ele\n // Senão, constrói contexto com user e resource do evalContext\n const conditionContext =\n context !== undefined\n ? context\n : ({\n user: evalContext.user,\n resource: evalContext.resource,\n metadata: evalContext.metadata,\n } as TContext);\n\n const allConditionsMet = permission.conditions.every((condition) =>\n condition(conditionContext),\n );\n\n if (!allConditionsMet) return false;\n }\n\n return true;\n }\n\n /**\n * Ordena permissões por prioridade e especificidade\n */\n private sortPermissions(\n permissions: PermissionRule<TContext>[],\n ): PermissionRule<TContext>[] {\n return permissions.sort((a, b) => {\n // Prioridade explícita\n if (a.priority !== undefined && b.priority !== undefined) {\n return b.priority - a.priority;\n }\n if (a.priority !== undefined) return -1;\n if (b.priority !== undefined) return 1;\n\n // Deny tem precedência sobre allow\n if (a.deny && !b.deny) return -1;\n if (!a.deny && b.deny) return 1;\n\n // Regras com condições têm precedência sobre regras sem condições\n const aHasConditions = a.conditions && a.conditions.length > 0;\n const bHasConditions = b.conditions && b.conditions.length > 0;\n\n if (aHasConditions && !bHasConditions) return -1;\n if (!aHasConditions && bHasConditions) return 1;\n\n // Mais específico primeiro (menos wildcards)\n const aSpecificity = this.calculateSpecificity(a);\n const bSpecificity = this.calculateSpecificity(b);\n\n return bSpecificity - aSpecificity;\n });\n }\n\n /**\n * Calcula especificidade de uma regra (mais alto = mais específico)\n */\n private calculateSpecificity(rule: PermissionRule<TContext>): number {\n let score = 0;\n\n // Ações específicas valem mais que wildcards\n const actions = Array.isArray(rule.action) ? rule.action : [rule.action];\n for (const action of actions) {\n if (!action.includes(this.config.wildcardPattern)) {\n score += 10;\n }\n }\n\n // Recursos específicos valem mais\n if (rule.resource) {\n const resources = Array.isArray(rule.resource)\n ? rule.resource\n : [rule.resource];\n for (const resource of resources) {\n if (!resource.includes(this.config.wildcardPattern)) {\n score += 10;\n }\n }\n }\n\n // Condições adicionam MUITA especificidade (devem ter prioridade)\n if (rule.conditions && rule.conditions.length > 0) {\n score += rule.conditions.length * 20;\n }\n\n return score;\n }\n\n /**\n * Formata regra para mensagem\n */\n private formatRule(rule: PermissionRule<TContext>): string {\n const parts = [];\n\n const actions = Array.isArray(rule.action) ? rule.action : [rule.action];\n parts.push(`action=${actions.join(\",\")}`);\n\n if (rule.resource) {\n const resources = Array.isArray(rule.resource)\n ? rule.resource\n : [rule.resource];\n parts.push(`resource=${resources.join(\",\")}`);\n }\n\n if (rule.conditions) {\n parts.push(`conditions=${rule.conditions.length}`);\n }\n\n return parts.join(\", \");\n }\n\n /**\n * Verifica cache\n */\n private checkCache(\n user: User<TContext>,\n action: PermissionAction,\n resource?: ResourceType,\n context?: TContext,\n ): EvaluationResult | null {\n const key = this.getCacheKey(user, action, resource, context);\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Verifica TTL\n if (Date.now() - entry.timestamp > this.config.cacheTTL) {\n this.cache.delete(key);\n return null;\n }\n\n if (this.config.debug) {\n console.log(`[ACL] Cache hit: ${key}`);\n }\n\n return entry.result;\n }\n\n /**\n * Salva no cache\n */\n private saveToCache(\n user: User<TContext>,\n action: PermissionAction,\n resource: ResourceType | undefined,\n result: EvaluationResult,\n context?: TContext,\n ): void {\n // Limita tamanho do cache\n if (this.cache.size >= this.config.cacheMaxSize) {\n // Remove entradas mais antigas\n const entriesToDelete = Math.floor(this.config.cacheMaxSize * 0.2); // Remove 20%\n const sortedEntries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp,\n );\n\n for (let i = 0; i < entriesToDelete; i++) {\n this.cache.delete(sortedEntries[i][0]);\n }\n }\n\n const key = this.getCacheKey(user, action, resource, context);\n this.cache.set(key, {\n key,\n result,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Gera chave de cache\n */\n private getCacheKey(\n user: User<TContext>,\n action: PermissionAction,\n resource?: ResourceType,\n context?: TContext,\n ): string {\n const parts = [\n `user:${user.id}`,\n `action:${action}`,\n `resource:${resource || \"none\"}`,\n `roles:${user.roles.join(\",\")}`,\n ];\n\n // Inclui hash do contexto se fornecido\n if (context) {\n const contextHash = this.hashContext(context);\n parts.push(`context:${contextHash}`);\n }\n\n return parts.join(\"|\");\n }\n\n /**\n * Gera hash simples do contexto para cache\n */\n private hashContext(context: TContext): string {\n try {\n return JSON.stringify(context);\n } catch {\n return \"unparseable\";\n }\n }\n\n /**\n * Limpa todo o cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n\n/**\n * Factory function para criar instância ACL\n */\nexport function createACL<TContext = any>(config?: ACLConfig): ACL<TContext> {\n return new ACL<TContext>(config);\n}\n","import type {\n PermissionBuilder,\n PermissionCondition,\n PermissionRule,\n} from \"../types\";\n\n/**\n * Builder fluente para criar permissões\n */\nexport class PermissionRuleBuilder<TContext = any>\n implements PermissionBuilder<TContext>\n{\n private rule: Partial<PermissionRule<TContext>> = {};\n\n action(action: string): this {\n this.rule.action = action;\n return this;\n }\n\n resource(resource: string): this {\n this.rule.resource = resource;\n return this;\n }\n\n when(condition: PermissionCondition<TContext>): this {\n if (!this.rule.conditions) {\n this.rule.conditions = [];\n }\n this.rule.conditions.push(condition);\n return this;\n }\n\n deny(): this {\n this.rule.deny = true;\n return this;\n }\n\n priority(value: number): this {\n this.rule.priority = value;\n return this;\n }\n\n build(): PermissionRule<TContext> {\n if (!this.rule.action) {\n throw new Error(\"Permission must have an action\");\n }\n\n return this.rule as PermissionRule<TContext>;\n }\n}\n\n/**\n * Factory para criar builder de permissão\n */\nexport function permission<TContext = any>(): PermissionBuilder<TContext> {\n return new PermissionRuleBuilder<TContext>();\n}\n\n/**\n * Helpers para criar permissões comuns rapidamente\n */\nexport const permissions = {\n // CRUD básico\n crud: (resource: string) => [\n { action: \"create\", resource },\n { action: \"read\", resource },\n { action: \"update\", resource },\n { action: \"delete\", resource },\n ],\n\n // Todas as ações em um recurso\n all: (resource: string) => ({\n action: \"*\",\n resource,\n }),\n\n // Ações de leitura\n readonly: (resource: string) => [\n { action: \"read\", resource },\n { action: \"list\", resource },\n { action: \"view\", resource },\n ],\n\n // Ações de escrita\n write: (resource: string) => [\n { action: \"create\", resource },\n { action: \"update\", resource },\n { action: \"delete\", resource },\n ],\n\n // Gerenciamento completo\n manage: (resource: string) => ({\n action: \"manage\",\n resource,\n }),\n};\n\n/**\n * Helper para criar condições comuns\n */\nexport const conditions = {\n // Verifica se é proprietário\n isOwner: <T extends { userId?: any; ownerId?: any }>(\n userIdField = \"userId\",\n ): PermissionCondition<{ user: { id: any }; resource: T }> => {\n return (context) => {\n if (!context.user || !context.user.id) return false;\n if (!context.resource) return false;\n\n const userId = context.user.id;\n const resourceOwnerId =\n (context.resource as any)[userIdField] || context.resource.ownerId;\n\n if (!resourceOwnerId) return false;\n\n return userId === resourceOwnerId;\n };\n },\n\n // Verifica se recurso está em determinado status\n hasStatus: <T extends { status?: string }>(\n ...statuses: string[]\n ): PermissionCondition<{ resource: T }> => {\n return (context) => {\n const resourceStatus = context.resource?.status;\n return resourceStatus ? statuses.includes(resourceStatus) : false;\n };\n },\n\n // Verifica se usuário tem atributo específico\n userHasAttribute: (\n attribute: string,\n value?: any,\n ): PermissionCondition<{ user: { attributes?: Record<string, any> } }> => {\n return (context) => {\n const userAttribute = context.user?.attributes?.[attribute];\n return value !== undefined\n ? userAttribute === value\n : userAttribute !== undefined;\n };\n },\n\n // Verifica se recurso foi criado há menos de X tempo\n createdWithin: <T extends { createdAt?: Date | string }>(\n milliseconds: number,\n ): PermissionCondition<{ resource: T }> => {\n return (context) => {\n const createdAt = context.resource?.createdAt;\n if (!createdAt) return false;\n\n const createdTime =\n createdAt instanceof Date\n ? createdAt.getTime()\n : new Date(createdAt).getTime();\n return Date.now() - createdTime <= milliseconds;\n };\n },\n\n // Combina múltiplas condições com AND\n and: <TContext>(\n ...conditions: PermissionCondition<TContext>[]\n ): PermissionCondition<TContext> => {\n return (context) => conditions.every((condition) => condition(context));\n },\n\n // Combina múltiplas condições com OR\n or: <TContext>(\n ...conditions: PermissionCondition<TContext>[]\n ): PermissionCondition<TContext> => {\n return (context) => conditions.some((condition) => condition(context));\n },\n\n // Nega uma condição\n not: <TContext>(\n condition: PermissionCondition<TContext>,\n ): PermissionCondition<TContext> => {\n return (context) => !condition(context);\n },\n};\n","import type { Role, PermissionRule } from \"../types\";\nimport { permissions, conditions } from \"./permission-builder\";\n\n/**\n * Roles predefinidas comuns que podem ser usadas como base\n */\nexport const rolePresets = {\n /**\n * Super administrador - acesso total\n */\n superAdmin: (): Role => ({\n name: \"super-admin\",\n permissions: [\n {\n action: \"*\",\n resource: \"*\",\n },\n ],\n }),\n\n /**\n * Administrador - gerencia tudo exceto configurações críticas\n */\n admin: (): Role => ({\n name: \"admin\",\n permissions: [\n {\n action: \"*\",\n resource: \"*\",\n },\n {\n action: \"*\",\n resource: \"system.*\",\n deny: true,\n },\n ],\n }),\n\n /**\n * Moderador - pode moderar conteúdo\n */\n moderator: (): Role => ({\n name: \"moderator\",\n permissions: [\n permissions.all(\"posts\"),\n permissions.all(\"comments\"),\n permissions.all(\"users\"),\n {\n action: \"delete\",\n resource: \"users\",\n deny: true, // Não pode deletar usuários\n },\n {\n action: \"ban\",\n resource: \"users\",\n },\n {\n action: \"unban\",\n resource: \"users\",\n },\n ],\n }),\n\n /**\n * Editor - pode criar e editar conteúdo\n */\n editor: (): Role => ({\n name: \"editor\",\n permissions: [\n ...permissions.crud(\"posts\"),\n ...permissions.crud(\"pages\"),\n ...permissions.crud(\"media\"),\n ...permissions.readonly(\"users\"),\n ...permissions.readonly(\"settings\"),\n ],\n }),\n\n /**\n * Autor - pode gerenciar apenas seu próprio conteúdo\n */\n author: <TContext = any>(): Role<TContext> => ({\n name: \"author\",\n permissions: [\n {\n action: \"create\",\n resource: \"posts\",\n },\n {\n action: [\"read\", \"update\", \"delete\"],\n resource: \"posts\",\n conditions: [conditions.isOwner(\"authorId\") as any],\n },\n ...permissions.readonly(\"posts\"), // Pode ler todos os posts\n ...permissions.crud(\"media\"),\n { action: \"upload\", resource: \"media\" }, // Upload é sinônimo de create para media\n ],\n }),\n\n /**\n * Usuário autenticado básico\n */\n user: <TContext = any>(): Role<TContext> => ({\n name: \"user\",\n permissions: [\n // Perfil próprio\n {\n action: [\"read\", \"update\"],\n resource: \"profile\",\n conditions: [conditions.isOwner() as any],\n },\n // Comentários\n {\n action: \"create\",\n resource: \"comments\",\n },\n {\n action: [\"update\", \"delete\"],\n resource: \"comments\",\n conditions: [conditions.isOwner() as any],\n },\n // Leitura geral\n {\n action: \"read\",\n resource: [\"posts\", \"pages\", \"comments\"],\n },\n ],\n }),\n\n /**\n * Visitante - acesso apenas leitura\n */\n guest: (): Role => ({\n name: \"guest\",\n permissions: [\n {\n action: \"read\",\n resource: [\"posts\", \"pages\", \"comments\"],\n conditions: [\n // Apenas conteúdo público\n (context: any) => context.resource?.visibility === \"public\",\n ],\n },\n ],\n }),\n};\n\n/**\n * Permissões predefinidas para recursos comuns\n */\nexport const resourcePermissions = {\n /**\n * Blog/CMS\n */\n blog: {\n posts: permissions.crud(\"posts\"),\n pages: permissions.crud(\"pages\"),\n comments: permissions.crud(\"comments\"),\n media: permissions.crud(\"media\"),\n categories: permissions.crud(\"categories\"),\n tags: permissions.crud(\"tags\"),\n },\n\n /**\n * E-commerce\n */\n ecommerce: {\n products: permissions.crud(\"products\"),\n orders: permissions.crud(\"orders\"),\n customers: permissions.crud(\"customers\"),\n inventory: permissions.crud(\"inventory\"),\n coupons: permissions.crud(\"coupons\"),\n shipping: permissions.crud(\"shipping\"),\n },\n\n /**\n * SaaS\n */\n saas: {\n organizations: permissions.crud(\"organizations\"),\n projects: permissions.crud(\"projects\"),\n teams: permissions.crud(\"teams\"),\n members: permissions.crud(\"members\"),\n billing: permissions.crud(\"billing\"),\n subscriptions: permissions.crud(\"subscriptions\"),\n },\n\n /**\n * Social\n */\n social: {\n posts: permissions.crud(\"posts\"),\n friends: permissions.crud(\"friends\"),\n messages: permissions.crud(\"messages\"),\n groups: permissions.crud(\"groups\"),\n events: permissions.crud(\"events\"),\n notifications: permissions.crud(\"notifications\"),\n },\n};\n\n/**\n * Helpers para criar estruturas de permissão comuns\n */\nexport const permissionPatterns = {\n /**\n * Padrão de propriedade - usuário só pode modificar seus próprios recursos\n */\n ownership: <\n TContext extends { user: { id: any }; resource?: { [key: string]: any } },\n >(\n resource: string,\n ownerField = \"userId\",\n ): PermissionRule<TContext>[] => [\n {\n action: \"create\",\n resource,\n },\n {\n action: [\"read\", \"update\", \"delete\"],\n resource,\n conditions: [conditions.isOwner(ownerField) as any],\n },\n ],\n\n /**\n * Padrão de colaboração - múltiplos níveis de acesso\n */\n collaboration: (resource: string): PermissionRule[] => [\n {\n action: \"*\",\n resource,\n conditions: [(context: any) => context.resource?.role === \"owner\"],\n },\n {\n action: [\"read\", \"update\"],\n resource,\n conditions: [(context: any) => context.resource?.role === \"editor\"],\n },\n {\n action: \"read\",\n resource,\n conditions: [(context: any) => context.resource?.role === \"viewer\"],\n },\n ],\n\n /**\n * Padrão de workflow - permissões baseadas em status\n */\n workflow: (\n resource: string,\n workflow: Record<string, string[]>,\n ): PermissionRule[] => {\n const rules: PermissionRule[] = [];\n\n Object.entries(workflow).forEach(([status, allowedActions]) => {\n allowedActions.forEach((action) => {\n rules.push({\n action,\n resource,\n conditions: [conditions.hasStatus(status)],\n });\n });\n });\n\n return rules;\n },\n};\n"],"mappings":"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","names":["permissions","permission","result","conditions"]}