Arquitetura do ecosif-auth

Visão Geral

O ecosif-auth é um microserviço de autenticação e autorização desenvolvido com Spring Boot 2.7.18 e Java 17. Ele fornece autenticação baseada em JWT (JSON Web Tokens) para os demais serviços do ecossistema eCosif.

Arquitetura em Camadas

O projeto segue a arquitetura em camadas do Spring Boot:

┌─────────────────────────────────────────┐
│          Controller Layer               │
│  (AuthController, DockerLogsController) │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│           Service Layer                 │
│  (UserService, LocalUserDetailService)  │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│         Repository Layer                │
│  (UserRepository, RoleRepository,       │
│   BusinessAccountRepository)            │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│         Database Layer                  │
│         (PostgreSQL)                    │
└─────────────────────────────────────────┘

Componentes Principais

1. Controllers (controller/)

Camada responsável por receber requisições HTTP e retornar respostas.

2. Services (service/)

Camada de lógica de negócio.

3. Repositories (repository/)

Camada de acesso a dados (Spring Data JPA).

4. Models (model/)

Entidades JPA que representam tabelas do banco de dados.

5. DTOs (dto/)

Objetos de transferência de dados para comunicação com a API.

6. Security (config/, starter JWT)

Componentes de segurança e autenticação.

JWT ECOSIF (ecosif-spring-boot-starter-security)

Login externo (security/external/, service/)

Config (config/)

Removidos (MVP3): pacote oauth2/, POST /api/auth/signin-azure, handlers OAuth2 server-side.

7. Exceptions (exception/)

Exceções customizadas e handlers.

8. Utilities (util/)

Utilitários auxiliares.

Fluxo de Autenticação

Autenticação Local (Usuário/Senha)

sequenceDiagram
    participant Client
    participant AuthController
    participant AuthenticationManager
    participant UserService
    participant UserRepository
    participant TokenProvider
    participant Database

    Client->>AuthController: POST /api/auth/signin (username, password)
    AuthController->>UserService: findUserByUsername(username)
    UserService->>UserRepository: findByUsername(username)
    UserRepository->>Database: SELECT * FROM gr_user WHERE username = ?
    Database-->>UserRepository: User
    UserRepository-->>UserService: User
    UserService-->>AuthController: User

    alt Usuário existe e está ativo
        AuthController->>AuthenticationManager: authenticate(username, password)
        AuthenticationManager->>UserService: loadUserByUsername(username)
        UserService->>UserRepository: findByUsername(username)
        UserRepository-->>UserService: User
        UserService-->>AuthenticationManager: UserDetails (LocalUser)
        AuthenticationManager->>AuthenticationManager: Validar senha (BCrypt)
        AuthenticationManager-->>AuthController: Authentication

        AuthController->>TokenProvider: createToken(localUser)
        TokenProvider-->>AuthController: JWT Token

        AuthController-->>Client: 200 OK + JWT Token + UserInfo
    else Usuário não existe ou credenciais inválidas
        AuthController-->>Client: 401 Unauthorized
    end

Login externo (external-login)

Ver diagrama e fluxo em fluxos.md.

Removido: signin com azure: true, POST /api/auth/signin-azure.

Segurança

Autenticação JWT

O serviço utiliza JWT ECOSIF via starter ecosif-spring-boot-starter-security (io.ecosif.security.jwt.TokenProvider).

Características do Token: - Algoritmo: HS256 (HMAC SHA-256) - Tempo de expiração: 30 minutos (padrão, configurável via TOKEN_EXPIRATION) - Claims incluídos: - sub: Username do usuário - iat: Data de emissão - exp: Data de expiração

Validação de Token

O TokenAuthenticationFilter intercepta todas as requisições e: 1. Extrai o token do header Authorization: Bearer <token> 2. Valida a assinatura do token 3. Verifica a expiração 4. Carrega o usuário associado ao token 5. Define o contexto de segurança do Spring

Login externo (IdP)

Microsoft Entra ID e Google: o browser obtém id_token (MSAL/GIS); o backend valida via JWKS em POST /api/auth/external-login. Ver external-login-api.md.

Banco de Dados

Schema Principal

Migrações

O projeto utiliza Flyway para gerenciamento de migrações de banco de dados. As migrações estão localizadas em src/main/resources/db/migration/.

Versões de migração importantes: - V0.6.00.0__Clean_Database.sql: Limpeza inicial do banco - V0.6.00.1__Banco_de_Dados_Inicial.sql: Criação do schema inicial - V0.6.00.3__Criacao_Usuario_admin.sql: Criação do usuário admin padrão - V0.7.00.0__Add_missing_columns_for_JPA_compatibility.sql: Adição de colunas para compatibilidade JPA

Integração com Outros Serviços

O ecosif-auth é o serviço central de autenticação do ecossistema eCosif. Os demais serviços (ecosif-masterdata, ecosif-moviments, etc.) validam os tokens JWT emitidos por este serviço.

Fluxo de Integração: 1. Cliente faz login no ecosif-auth 2. ecosif-auth retorna JWT token 3. Cliente usa o token em requisições para outros serviços 4. Cada serviço valida o token (usando a mesma chave secreta) 5. Serviço processa a requisição autenticada

Tecnologias Utilizadas

Configuração

As configurações são gerenciadas através de:

  1. application.yml: Configurações principais
  2. Variáveis de ambiente: Configurações sensíveis e específicas do ambiente
  3. AppProperties: Classe Java para propriedades customizadas

Principais propriedades: - app.auth.tokenSecret: Chave secreta para assinar tokens JWT - app.auth.tokenExpirationMsec: Tempo de expiração do token em milissegundos - ecosif.auth.providers / ecosif.auth.provisioning: login externo (ECOSIF_AUTH_*)