Skip to content

v3.0.4

Choose a tag to compare

@github-actions github-actions released this 21 Jul 12:44
· 156 commits to main since this release

🚀 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 TOTP
  • MfaService — 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/authenticate devolve um desafio (mfa_required + challenge_token) e o cliente completa em POST /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ão 0 = desligada)
  • Nova coluna nullable DT_ULTIMA_TROCA_SENHA, atualizada em todo fluxo de troca de senha
  • Flags Boolean nulas não estouram mais NPE nos métodos de UserDetails

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>