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)
| Tabela | Para quê |
|---|---|
users | Identidade global de uma pessoa; no máximo um usuário por party. |
user_logins | Identificadores de login no namespace de um tenant (CPF, CNPJ, e-mail, código, username). |
platform_logins | Identificadores de login do operador de plataforma (username ou e-mail), sem tenant; únicos globalmente enquanto ativos. |
user_credentials | Liga um usuário às suas credenciais de login; uma credencial pertence a um único usuário. |
sessions | Sessão autenticada: usuário, login e credencial usados, dados do cliente, expiração e revogação. |
refresh_tokens | Tokens 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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
id | bigint | não | identity (GENERATED ALWAYS) |
party_id | bigint | não | |
disabled_at | timestamptz | sim | |
created_at | timestamptz | não | padrão clock_timestamp() |
updated_at | timestamptz | não | padrã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
| Tipo | Nome | Definição |
|---|---|---|
| PK | users_pkey | PRIMARY KEY (id) |
| UNIQUE | users_id_party_key | UNIQUE (id, party_id) |
| UNIQUE | users_party_key | UNIQUE (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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
id | bigint | não | identity (GENERATED ALWAYS) |
user_id | bigint | não | |
tenant_id | bigint | não | namespace de autenticação |
kind | text | não | cpf | cnpj | email | code | username |
value | text | não | como digitado |
value_normalized | text | não | chave de busca |
verified_at | timestamptz | sim | e-mail/telefone verificado |
created_at | timestamptz | não | padrão clock_timestamp() |
revoked_at | timestamptz | sim |
Chaves estrangeiras
tenant_id→tenants.iduser_id→users.id
Referenciada por: sessions.
Garantido pelo banco
| Tipo | Nome | Definição |
|---|---|---|
| CHECK | user_logins_kind_check | CHECK ((kind IN ('cpf', 'cnpj', 'email', 'code', 'username'))) |
| PK | user_logins_pkey | PRIMARY KEY (id) |
| UNIQUE | user_logins_id_user_key | UNIQUE (id, user_id) |
| UNIQUE parcial | user_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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
id | bigint | não | identity (GENERATED ALWAYS) |
user_id | bigint | não | |
kind | text | não | username | email |
value | text | não | como digitado |
value_normalized | text | não | chave de busca |
verified_at | timestamptz | sim | e-mail verificado |
created_at | timestamptz | não | padrão clock_timestamp() |
revoked_at | timestamptz | sim |
Chaves estrangeiras
user_id→users.id
Garantido pelo banco
| Tipo | Nome | Definição |
|---|---|---|
| CHECK | platform_logins_kind_check | CHECK ((kind IN ('username', 'email'))) |
| PK | platform_logins_pkey | PRIMARY KEY (id) |
| UNIQUE | platform_logins_id_user_key | UNIQUE (id, user_id) |
| UNIQUE parcial | platform_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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
user_id | bigint | não | |
credential_id | bigint | não | |
created_at | timestamptz | não | padrão clock_timestamp() |
revoked_at | timestamptz | sim |
Chaves estrangeiras
credential_id→credentials.iduser_id→users.id
Referenciada por: sessions.
Garantido pelo banco
| Tipo | Nome | Definição |
|---|---|---|
| PK | user_credentials_pkey | PRIMARY KEY (user_id, credential_id) |
| UNIQUE | user_credentials_credential_key | UNIQUE (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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
id | bigint | não | identity (GENERATED ALWAYS) |
uid | text | não | |
user_id | bigint | não | |
login_id | bigint | sim | login usado na autenticação de tenant; do mesmo usuário |
credential_id | bigint | sim | |
created_ip | inet | sim | |
last_ip | inet | sim | |
user_agent | text | sim | |
client | text | sim | |
device_label | text | sim | |
mfa_at | timestamptz | sim | |
last_seen_at | timestamptz | não | padrão clock_timestamp() |
idle_expires_at | timestamptz | sim | |
revoked_at | timestamptz | sim | |
revoked_reason | text | sim | |
revoked_by | bigint | sim | |
created_at | timestamptz | não | padrão clock_timestamp() |
expires_at | timestamptz | não | |
scope | text | não | platform | 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.iduser_id→users.id
Referenciada por: refresh_tokens, session_contexts, session_memberships.
Garantido pelo banco
| Tipo | Nome | Definição |
|---|---|---|
| PK | sessions_pkey | PRIMARY KEY (id) |
| UNIQUE | sessions_id_user_key | UNIQUE (id, user_id) |
| UNIQUE | sessions_uid_unique | UNIQUE (uid) |
Fora do banco
scope(platformoutenant) 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.
| Coluna | Tipo | Nulo | Observação |
|---|---|---|---|
id | bigint | não | identity (GENERATED ALWAYS) |
session_id | bigint | não | |
token_sha256 | bytea | não | |
issued_at | timestamptz | não | padrão clock_timestamp() |
expires_at | timestamptz | não | |
used_at | timestamptz | sim | |
grace_until | timestamptz | sim | reservado |
replaced_by | bigint | sim |
Chaves estrangeiras
replaced_by→refresh_tokens.idsession_id→sessions.id
Garantido pelo banco
| Tipo | Nome | Definição |
|---|---|---|
| PK | refresh_tokens_pkey | PRIMARY KEY (id) |
| UNIQUE | refresh_tokens_token_sha256_unique | UNIQUE (token_sha256) |
| UNIQUE parcial | refresh_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.