Segurança & Controle de Acesso
Gerencie actors de autenticação, escopos de autorização e políticas de acesso.
Carregamento
local security = require("security")
actor
Retorna o actor de segurança atual do contexto de execução.
local actor = security.actor()
if actor then
local id = actor:id()
local meta = actor:meta()
logger:info("Request de", {
user_id = id,
role = meta.role
})
end
Retorna: Actor|nil
scope
Retorna o escopo de segurança atual do contexto de execução.
local scope = security.scope()
if scope then
local policies = scope:policies()
for _, policy in ipairs(policies) do
print("Política ativa:", policy:id())
end
end
Retorna: Scope|nil
can
Verifica se o contexto atual permite uma ação em um recurso.
-- Verificar permissão de leitura
if not security.can("read", "user:" .. user_id) then
return nil, errors.new("PERMISSION_DENIED", "Não pode ler dados do usuário")
end
-- Verificar permissão de escrita
if not security.can("write", "order:" .. order_id) then
return nil, errors.new("PERMISSION_DENIED", "Não pode modificar pedido")
end
-- Verificar com metadados
local allowed = security.can("delete", "document:" .. doc_id, {
owner_id = doc.owner_id,
department = doc.department
})
| Parâmetro | Tipo | Descrição |
|---|---|---|
action |
string | Ação a verificar |
resource |
string | Identificador do recurso |
meta |
table | Metadados adicionais (opcional) |
Retorna: boolean
new_actor
Cria um novo actor com ID e metadados.
-- Criar actor de usuário
local actor = security.new_actor("user:" .. user.id, {
role = user.role,
department = user.department,
email = user.email
})
-- Criar actor de servico
local service_actor = security.new_actor("service:payment-processor", {
type = "service",
version = "1.0.0"
})
| Parâmetro | Tipo | Descrição |
|---|---|---|
id |
string | Identificador único do actor |
meta |
table | Pares chave-valor de metadados |
Retorna: Actor
new_scope
Cria um novo escopo customizado.
-- Escopo vazio
local scope = security.new_scope()
-- Escopo com políticas
local read_policy = security.policy("app:read-only")
local scope = security.new_scope({read_policy})
-- Construir escopo incrementalmente
local scope = security.new_scope()
local policy1 = security.policy("app:read")
local policy2 = security.policy("app:write")
scope = scope:with(policy1):with(policy2)
Retorna: Scope
policy
Obtem uma política do registry.
local policy, err = security.policy("app:admin-access")
if err then
return nil, err
end
-- Avaliar política
local result = policy:evaluate(actor, "delete", "user:123")
if result == "allow" then
-- permitido
elseif result == "deny" then
-- proibido
else
-- undefined, verificar outras políticas
end
| Parâmetro | Tipo | Descrição |
|---|---|---|
id |
string | ID da política "namespace:nome" |
Retorna: Policy, error
named_scope
Obtem um grupo de políticas pre-definido.
-- Obter escopo admin
local admin_scope, err = security.named_scope("app:admin")
if err then
return nil, err
end
-- Usar para operações elevadas
local result = admin_scope:evaluate(actor, "delete", "user:123")
| Parâmetro | Tipo | Descrição |
|---|---|---|
id |
string | ID do grupo de políticas |
Retorna: Scope, error
token_store
Obtem um token store para gerenciar tokens de autenticação.
local store, err = security.token_store("app:tokens")
if err then
return nil, err
end
-- Usar store...
store:close()
| Parâmetro | Tipo | Descrição |
|---|---|---|
id |
string | ID do token store "namespace:nome" |
Retorna: TokenStore, error
Métodos do Actor
| Método | Retorna | Descrição |
|---|---|---|
actor:id() |
string | Identificador do actor |
actor:meta() |
table | Metadados do actor |
Métodos do Scope
with / without
Adiciona ou remove políticas do escopo.
local scope = security.new_scope()
-- Adicionar política
local write_policy = security.policy("app:write")
scope = scope:with(write_policy)
-- Remover política
scope = scope:without("app:read-only")
evaluate
Avalia todas as políticas no escopo.
local result = scope:evaluate(actor, "read", "document:123")
-- "allow", "deny", ou "undefined"
if result ~= "allow" then
return nil, errors.new("PERMISSION_DENIED", "Acesso negado")
end
contains
Verifica se o escopo contem uma política.
if scope:contains("app:admin") then
show_admin_features()
end
policies
Retorna todas as políticas no escopo.
local policies = scope:policies()
for _, policy in ipairs(policies) do
print(policy:id())
end
Retorna: Policy[]
Métodos da Policy
| Método | Retorna | Descrição |
|---|---|---|
policy:id() |
string | Identificador da política |
policy:evaluate(actor, action, resource, meta?) |
string | "allow", "deny", ou "undefined" |
Métodos do TokenStore
create
Criar token de autenticação.
local actor = security.new_actor("user:123", {role = "user"})
local scope = security.named_scope("app:default")
local token, err = store:create(actor, scope, {
expiration = "24h", -- ou milissegundos
meta = {
login_ip = request_ip,
user_agent = user_agent
}
})
| Parâmetro | Tipo | Descrição |
|---|---|---|
actor |
Actor | Actor para o token |
scope |
Scope | Escopo de permissões |
options.expiration |
string/number | String de duração ou ms |
options.meta |
table | Metadados do token |
Retorna: string, error
validate
Validar token e obter actor/scope.
local actor, scope, err = store:validate(token)
if err then
return nil, errors.new("UNAUTHENTICATED", "Token inválido")
end
Retorna: Actor, Scope, error
revoke
Invalidar um token.
local ok, err = store:revoke(token)
Retorna: boolean, error
close
Liberar o recurso do token store.
store:close()
Retorna: boolean
Permissões
Operações de segurança estao sujeitas a avaliação de política de segurança.
Acoes de Segurança
| Ação | Recurso | Descrição |
|---|---|---|
security.policy.get |
ID da Policy | Acessar definicoes de política |
security.policy_group.get |
ID do Grupo | Acessar escopos nomeados |
security.scope.create |
custom |
Criar escopos customizados |
security.actor.create |
ID do Actor | Criar actors |
security.token_store.get |
ID da Store | Acessar token stores |
security.token.validate |
ID da Store | Validar tokens |
security.token.create |
ID da Store | Criar tokens |
security.token.revoke |
ID da Store | Revogar tokens |
Veja Security Model para configuração de políticas.
Erros
| Condição | Tipo | Retentável |
|---|---|---|
| Sem contexto | errors.INTERNAL |
não |
| ID de token store vazio | errors.INVALID |
não |
| Permissão negada | errors.INVALID |
não |
| Política não encontrada | errors.INTERNAL |
não |
| Token store não encontrado | errors.INTERNAL |
não |
| Token store fechado | errors.INTERNAL |
não |
| Formato de expiração inválido | errors.INVALID |
não |
| Validação de token falhou | errors.INTERNAL |
não |
local store, err = security.token_store("app:tokens")
if err then
if errors.is(err, errors.INVALID) then
print("Requisição invalida:", err:message())
end
return nil, err
end
Veja Error Handling para trabalhar com erros.
Veja Também
- Security Model - Configuração de actors, políticas, escopos
- HTTP Middleware - Endpoint e resource firewall