Monalisa
Modelo de dados

Identity

Usuários, identificadores de login, credenciais de login, sessões e refresh tokens.

Um usuário é a identidade global de uma pessoa (uma party de pessoa física). Os identificadores de login vivem em duas tabelas: user_logins, por tenant, e platform_logins, sem tenant, para operadores de plataforma. A senha não fica aqui: user_credentials liga o usuário a uma credencial do domínio Credentials.

As tabelas de sessão e refresh token existem no schema, mas a autenticação está em reconstrução: o login antigo foi removido e nenhuma rota cria sessão hoje (ver Autenticação). Esta página descreve só o schema.

Tabelas (6)

TabelaPara quê
usersIdentidade global de uma pessoa; no máximo um usuário por party.
user_loginsIdentificadores de login no namespace de um tenant (CPF, CNPJ, e-mail, código, username).
platform_loginsIdentificadores de login do operador de plataforma (username ou e-mail), sem tenant; únicos globalmente enquanto ativos.
user_credentialsLiga um usuário às suas credenciais de login; uma credencial pertence a um único usuário.
sessionsSessão autenticada: usuário, login e credencial usados, dados do cliente, expiração e revogação.
refresh_tokensTokens de renovação de uma sessão: só o SHA-256 é guardado, com uso único e encadeamento (replaced_by).

Referência

users

Identidade global de uma pessoa; no máximo um usuário por party.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
party_idbigintnão
disabled_attimestamptzsim
created_attimestamptznãopadrão clock_timestamp()
updated_attimestamptznãopadrão clock_timestamp()

Chaves estrangeiras

  • party_id → person_profiles.party_id

Referenciada por: access_profile_template_changes, access_profiles, bank_credential_deliveries, bank_user_assignments, bank_user_transfers, broker_affiliations, broker_store_codes, credential_versions, invitation_deliveries, invitations, membership_access_profiles, membership_brokers, membership_portfolios, membership_teams, memberships, platform_grants, platform_invitation_deliveries, platform_invitations, platform_logins, sessions, task_run_user_actors, team_financial_institution_accounts, team_hierarchies, teams, user_banks, user_credentials, user_logins.

Garantido pelo banco

TipoNomeDefinição
PKusers_pkeyPRIMARY KEY (id)
UNIQUEusers_id_party_keyUNIQUE (id, party_id)
UNIQUEusers_party_keyUNIQUE (party_id)

Fora do banco

  • Todo usuário nascer de um convite aceito é regra de negócio sem constraint no banco hoje.

user_logins

Identificadores de login no namespace de um tenant (CPF, CNPJ, e-mail, código, username). O mesmo valor pode existir em tenants diferentes e não une pessoas.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
user_idbigintnão
tenant_idbigintnãonamespace de autenticação
kindtextnãocpf | cnpj | email | code | username
valuetextnãocomo digitado
value_normalizedtextnãochave de busca
verified_attimestamptzsime-mail/telefone verificado
created_attimestamptznãopadrão clock_timestamp()
revoked_attimestamptzsim

Chaves estrangeiras

  • tenant_id → tenants.id
  • user_id → users.id

Referenciada por: sessions.

Garantido pelo banco

TipoNomeDefinição
CHECKuser_logins_kind_checkCHECK ((kind IN ('cpf', 'cnpj', 'email', 'code', 'username')))
PKuser_logins_pkeyPRIMARY KEY (id)
UNIQUEuser_logins_id_user_keyUNIQUE (id, user_id)
UNIQUE parcialuser_logins_live_key(tenant_id, kind, value_normalized) WHERE (revoked_at IS NULL)

Fora do banco

  • Normalização de value_normalized é feita no código (login-normalization.ts).

platform_logins

Identificadores de login do operador de plataforma (username ou e-mail), sem tenant; únicos globalmente enquanto ativos.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
user_idbigintnão
kindtextnãousername | email
valuetextnãocomo digitado
value_normalizedtextnãochave de busca
verified_attimestamptzsime-mail verificado
created_attimestamptznãopadrão clock_timestamp()
revoked_attimestamptzsim

Chaves estrangeiras

  • user_id → users.id

Garantido pelo banco

TipoNomeDefinição
CHECKplatform_logins_kind_checkCHECK ((kind IN ('username', 'email')))
PKplatform_logins_pkeyPRIMARY KEY (id)
UNIQUEplatform_logins_id_user_keyUNIQUE (id, user_id)
UNIQUE parcialplatform_logins_live_key(kind, value_normalized) WHERE (revoked_at IS NULL)

Fora do banco

  • A ligação da sessão de plataforma com este login ainda não existe; vem com a reconstrução da autenticação.

user_credentials

Liga um usuário às suas credenciais de login; uma credencial pertence a um único usuário.

ColunaTipoNuloObservação
user_idbigintnão
credential_idbigintnão
created_attimestamptznãopadrão clock_timestamp()
revoked_attimestamptzsim

Chaves estrangeiras

  • credential_id → credentials.id
  • user_id → users.id

Referenciada por: sessions.

Garantido pelo banco

TipoNomeDefinição
PKuser_credentials_pkeyPRIMARY KEY (user_id, credential_id)
UNIQUEuser_credentials_credential_keyUNIQUE (credential_id)

Fora do banco

  • Nenhuma regra registrada além das constraints acima.

sessions

Sessão autenticada: usuário, login e credencial usados, dados do cliente, expiração e revogação. Schema apenas: nenhuma rota cria sessão até a reconstrução da autenticação.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
uidtextnão
user_idbigintnão
login_idbigintsimlogin usado na autenticação de tenant; do mesmo usuário
credential_idbigintsim
created_ipinetsim
last_ipinetsim
user_agenttextsim
clienttextsim
device_labeltextsim
mfa_attimestamptzsim
last_seen_attimestamptznãopadrão clock_timestamp()
idle_expires_attimestamptzsim
revoked_attimestamptzsim
revoked_reasontextsim
revoked_bybigintsim
created_attimestamptznãopadrão clock_timestamp()
expires_attimestamptznão
scopetextnãoplatform | tenant

Chaves estrangeiras

  • (login_id, user_id) → user_logins (id, user_id)
  • (user_id, credential_id) → user_credentials (user_id, credential_id)
  • revoked_by → users.id
  • user_id → users.id

Referenciada por: refresh_tokens, session_contexts, session_memberships.

Garantido pelo banco

TipoNomeDefinição
PKsessions_pkeyPRIMARY KEY (id)
UNIQUEsessions_id_user_keyUNIQUE (id, user_id)
UNIQUEsessions_uid_uniqueUNIQUE (uid)

Fora do banco

  • scope (platform ou tenant) não tem CHECK.
  • Regras de expiração ociosa e de renovação pertencem à autenticação em reconstrução.

refresh_tokens

Tokens de renovação de uma sessão: só o SHA-256 é guardado, com uso único e encadeamento (replaced_by). Schema apenas, sem runtime hoje.

ColunaTipoNuloObservação
idbigintnãoidentity (GENERATED ALWAYS)
session_idbigintnão
token_sha256byteanão
issued_attimestamptznãopadrão clock_timestamp()
expires_attimestamptznão
used_attimestamptzsim
grace_untiltimestamptzsimreservado
replaced_bybigintsim

Chaves estrangeiras

  • replaced_by → refresh_tokens.id
  • session_id → sessions.id

Garantido pelo banco

TipoNomeDefinição
PKrefresh_tokens_pkeyPRIMARY KEY (id)
UNIQUErefresh_tokens_token_sha256_uniqueUNIQUE (token_sha256)
UNIQUE parcialrefresh_tokens_live_key(session_id) WHERE (used_at IS NULL)

Fora do banco

  • Detecção de reutilização e revogação da família dependem da autenticação em reconstrução.

Nesta página