@shield-acl/core
Version:
Sistema ACL (Access Control List) inteligente e granular com algoritmos de permissões
265 lines (197 loc) • 6.45 kB
Markdown
# @shield-acl/core
<div align="center">
<img src="https://raw.githubusercontent.com/andersondrosa/andersondrosa/refs/heads/main/images/shield-acl.png" alt="Shield ACL Core" width="400" />
</div>
<div align="center">
<p><strong>Motor de ACL inteligente e granular com algoritmos otimizados</strong></p>
<p>Biblioteca puramente funcional sem dependências de framework.</p>
</div>
## Características
- 🎯 **Granular**: Controle fino de permissões com ações, recursos e condições
- 🔐 **Seguro**: Deny by default, com negação explícita
- 🚀 **Performático**: Cache inteligente e otimizações de avaliação
- 🧩 **Extensível**: Sistema de plugins e condições customizadas
- 🌳 **Hierárquico**: Herança de roles e composição de permissões
- ⚡ **TypeScript**: Totalmente tipado com IntelliSense completo
- 🎪 **Sem dependências**: Algoritmos puros sem dependências externas
## Instalação
```bash
npm install @shield-acl/core
# ou
yarn add @shield-acl/core
# ou
pnpm add @shield-acl/core
```
## Uso Básico
```typescript
import { ACL } from '@shield-acl/core'
// 1. Criar instância do ACL
const acl = new ACL()
// 2. Definir roles
acl.defineRole({
name: 'admin',
permissions: [
{ action: '*', resource: '*' } // Admin pode tudo
]
})
acl.defineRole({
name: 'user',
permissions: [
{ action: 'read', resource: 'posts' },
{
action: ['update', 'delete'],
resource: 'posts',
conditions: [(ctx) => ctx.resource?.authorId === ctx.user.id]
}
]
})
// 3. Criar usuário
const user = {
id: 1,
roles: ['user'],
permissions: [
{ action: 'create', resource: 'comments' } // Permissão direta
]
}
// 4. Verificar permissões
const canRead = acl.can(user, 'read', 'posts') // true
const canDelete = acl.can(user, 'delete', 'posts', {
resource: { authorId: 1 }
}) // true (é o autor)
const canDeleteOthers = acl.can(user, 'delete', 'posts', {
resource: { authorId: 2 }
}) // false (não é o autor)
```
## Algoritmos e Conceitos
### 1. Avaliação de Permissões
O algoritmo de avaliação segue esta ordem de prioridade:
1. **Negações explícitas** (deny) têm prioridade máxima
2. **Permissões diretas do usuário** sobrescrevem roles
3. **Permissões das roles** (com suporte a herança)
4. **Default deny** se nenhuma regra permitir
### 2. Pattern Matching
Suporte completo a wildcards e patterns:
```typescript
// Wildcards simples
{ action: 'posts.*' } // Qualquer ação em posts
{ action: '*.read' } // Leitura em qualquer recurso
{ action: '*', resource: 'admin/*' } // Qualquer ação em recursos admin
// Arrays de permissões
{ action: ['create', 'read', 'update'], resource: 'posts' }
// Negação explícita
{ action: 'delete', resource: 'users', deny: true }
```
### 3. Condições Dinâmicas
Avaliação condicional baseada em contexto:
```typescript
const ownerCondition = (ctx) => ctx.resource?.ownerId === ctx.user.id
const publishedCondition = (ctx) => ctx.resource?.status === 'published'
acl.defineRole({
name: 'author',
permissions: [{
action: 'edit',
resource: 'posts',
conditions: [ownerCondition] // Só pode editar próprios posts
}]
})
```
### 4. Herança de Roles
Sistema hierárquico com herança múltipla:
```typescript
acl.defineRole({
name: 'moderator',
inherits: ['user'], // Herda permissões de user
permissions: [
{ action: 'moderate', resource: 'comments' },
{ action: 'ban', resource: 'users' }
]
})
acl.defineRole({
name: 'admin',
inherits: ['moderator'], // Herda de moderator (e user)
permissions: [
{ action: '*', resource: '*' }
]
})
```
## API Completa
### ACL Class
```typescript
const acl = new ACL(config?: ACLConfig)
```
Configurações disponíveis:
```typescript
interface ACLConfig {
wildcardPattern?: string // Default: "*"
caseSensitive?: boolean // Default: false
cache?: boolean // Default: true
cacheMaxSize?: number // Default: 1000
cacheTTL?: number // Default: 300000 (5 min)
defaultDeny?: boolean // Default: true
debug?: boolean // Default: false
}
```
### Métodos Principais
#### defineRole(role: Role): void
Define uma nova role no sistema.
#### can(user: User, action: string, resource?: string, context?: any): boolean
Verifica se o usuário tem permissão para executar a ação.
#### evaluate(user: User, action: string, resource?: string, context?: any): EvaluationResult
Retorna resultado detalhado da avaliação com motivo.
#### getUserPermissions(user: User): PermissionRule[]
Obtém todas as permissões efetivas do usuário.
#### getRoleHierarchy(roleName: string): string[]
Retorna a hierarquia completa de uma role.
#### clearCache(): void
Limpa o cache de avaliações.
## Helpers e Utilities
### Permission Builder
API fluente para criar permissões:
```typescript
import { permission } from '@shield-acl/core'
const perm = permission()
.action('posts.write')
.resource('posts')
.when((ctx) => ctx.user.verified)
.build()
```
### Presets
Conjuntos de permissões pré-definidos:
```typescript
import { presets } from '@shield-acl/core'
// CRUD completo
const crudPosts = presets.crud('posts')
// Gera: create, read, update, delete para posts
// Somente leitura
const readOnly = presets.readonly(['posts', 'comments'])
// Gera: read para posts e comments
// Moderação
const modPerms = presets.moderation(['comments', 'posts'])
// Gera: approve, reject, flag para os recursos
```
## Performance
### Cache Inteligente
O sistema implementa cache LRU com TTL configurável:
- Avaliações idênticas são cacheadas
- Cache key baseado em: user.id + action + resource + context hash
- Invalidação automática ao modificar roles
- Limite configurável de entradas
### Otimizações
1. **Early termination**: Para ao encontrar deny explícito
2. **Pattern compilation**: Regex compilados e cacheados
3. **Hierarchy memoization**: Hierarquia de roles calculada uma vez
4. **Batch evaluation**: Suporte para verificar múltiplas permissões
## Testes
```bash
# Rodar testes
pnpm test
# Coverage
pnpm test:coverage
# Watch mode
pnpm test:watch
```
## Documentação Adicional
- [Algoritmo ACL Detalhado](./docs/ACL-ALGORITHM.md) - Documentação técnica completa do algoritmo
- [Funcionamento Interno](./docs/FUNCIONAMENTO.md) - Explicação detalhada da lógica interna
## Licença
MIT © Anderson D. Rosa