Repository navigation
v3.0.4
🚀 Archbase Framework v3.0.4
Spring Boot 4.1 / Hibernate 7 / Jackson 3 / Java 25.
MFA / 2FA (TOTP)
Segundo fator opcional, baseado em TOTP (RFC 6238):
TotpService— geração e verificação de códigos TOTPMfaService— enrolamento, ativação, desativação e verificação; segredo cifrado em repouso (AES-GCM), códigos de recuperação de uso único com hash bcrypt- Login em duas etapas:
/auth/authenticatedevolve um desafio (mfa_required+challenge_token) e o cliente completa emPOST /auth/mfa/verify - Colunas aditivas e nullable:
BO_MFA_HABILITADO,MFA_SECRET,MFA_RECOVERY_CODES
Ausente ou desabilitado para o usuário, o fluxo de login segue inalterado.
Correção: credenciais expiradas no login
UserEntity.isCredentialsNonExpired() retornava passwordNeverExpires cru, então BO_SENHA_NUNCA_EXPIRA = 'N' significava "credenciais expiradas agora, para sempre" — o usuário não autenticava nem logo após redefinir a senha com token válido. E changePasswordOnNextLogin nunca era lido em lugar nenhum.
Nova regra, nesta ordem:
| Condição | Resultado |
|---|---|
changePasswordOnNextLogin = true |
credenciais expiradas — força a troca |
passwordNeverExpires true ou nulo |
válidas |
passwordNeverExpires = false e expiration-days = 0 |
válidas (política desligada) |
passwordNeverExpires = false e senha além do prazo |
expiradas |
ArchbasePasswordPolicy+archbase.security.password.expiration-days(padrão0= desligada)- Nova coluna nullable
DT_ULTIMA_TROCA_SENHA, atualizada em todo fluxo de troca de senha - Flags
Booleannulas não estouram mais NPE nos métodos deUserDetails
Endurecimento do refresh token
O refresh só validava assinatura e usuário: conta desativada, bloqueada ou com troca de senha pendente renovava tokens indefinidamente. Agora o estado da conta é reavaliado e o endpoint devolve 403 CREDENTIALS_EXPIRED / ACCOUNT_DISABLED — antes essas exceções viravam 500.
⚠️ Migração obrigatória
ALTER TABLE SEGURANCA ADD COLUMN IF NOT EXISTS DT_ULTIMA_TROCA_SENHA TIMESTAMP NULL;
ALTER TABLE SEGURANCA ADD COLUMN IF NOT EXISTS BO_MFA_HABILITADO VARCHAR(1) NULL;
ALTER TABLE SEGURANCA ADD COLUMN IF NOT EXISTS MFA_SECRET VARCHAR(255) NULL;
ALTER TABLE SEGURANCA ADD COLUMN IF NOT EXISTS MFA_RECOVERY_CODES VARCHAR(2048) NULL;Colunas nullable, sem backfill. Com ddl-auto=validate, a aplicação não sobe sem elas.
⚠️ Mudança de comportamento
BO_SENHA_NUNCA_EXPIRA = 'N' deixa de bloquear o login. Quem usava esse efeito colateral para forçar a troca de senha deve passar a usar BO_ALTERAR_SENHA_PROXIMO_LOGIN = 'S'; para expiração periódica real, configure archbase.security.password.expiration-days.
Frontend
Contraparte em archbase-react 4.0.41.
Instalação
<dependency>
<groupId>br.com.archbase</groupId>
<artifactId>archbase-starter</artifactId>
<version>3.0.4</version>
</dependency>