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.
- AuthController: Gerencia autenticação local e Azure AD
- DockerLogsController: Endpoints administrativos para visualização de logs
2. Services (service/)
Camada de lógica de negócio.
- UserService: Interface para operações de usuário
- UserServiceImpl: Implementação das operações de usuário
- LocalUserDetailService: Integração com Spring Security para autenticação
3. Repositories (repository/)
Camada de acesso a dados (Spring Data JPA).
- UserRepository: Operações CRUD de usuários
- RoleRepository: Gerenciamento de roles/perfis
- BusinessAccountRepository: Gerenciamento de contas de negócio (tenants)
4. Models (model/)
Entidades JPA que representam tabelas do banco de dados.
- User: Entidade de usuário (
gr_user) - Role: Entidade de role/perfil (
roles) - BusinessAccount: Entidade de conta de negócio (
businessaccount)
5. DTOs (dto/)
Objetos de transferência de dados para comunicação com a API.
- LoginRequest: DTO para requisição de login
- LoginRequestAzure: DTO para requisição de login Azure AD
- UserCreateAzureDTO: DTO para criação de usuário via Azure AD
- JwtAuthenticationResponse: DTO de resposta com token JWT
- UserInfo: DTO com informações do usuário
- ApiResponse: DTO genérico para respostas de erro
6. Security (config/, starter JWT)
Componentes de segurança e autenticação.
JWT ECOSIF (ecosif-spring-boot-starter-security)
io.ecosif.security.jwt.TokenProvider: emissão/validação JWT HMAC (AUTH_TOKEN_SECRET)io.ecosif.security.jwt.TokenAuthenticationFilter: filtroAuthorization: Bearer
Login externo (security/external/, service/)
ExternalLoginController:POST /api/auth/external-loginExternalAuthenticationService: orquestra validators JWKS + provisionamento- Validators: Azure, Azure Enterprise, Google (condicionais a
ECOSIF_AUTH_PROVIDER)
Config (config/)
- WebSecurityConfig: stateless + filtro JWT do starter
- PasswordEncoderConfig: BCrypt
- OpenApiConfig, GlobalExceptionHandler, RestAuthenticationEntryPoint
Removidos (MVP3): pacote oauth2/, POST /api/auth/signin-azure, handlers OAuth2 server-side.
7. Exceptions (exception/)
Exceções customizadas e handlers.
- BadRequestException: Erro de requisição inválida
- ResourceNotFoundException: Recurso não encontrado
- RestResponseEntityExceptionHandler: Handler de exceções REST
8. Utilities (util/)
Utilitários auxiliares.
- CookieUtils: Utilitários para manipulação de cookies
- GeneralUtils: Utilitários gerais
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
- gr_user: Tabela de usuários
- roles: Tabela de roles/perfis (não utilizada atualmente, roles estão na coluna
roleda tabelagr_user) - businessaccount: Tabela de contas de negócio (tenants)
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
- Java 17: Linguagem de programação
- Spring Boot 2.7.18: Framework Java
- Spring Security: Segurança e autenticação
- Spring Data JPA: Persistência de dados
- JJWT 0.11.5: Biblioteca para JWT
- PostgreSQL: Banco de dados
- Flyway: Migrações de banco de dados
- SpringDoc OpenAPI 3.0: Documentação da API (Swagger)
- Lombok: Redução de boilerplate
- Maven: Gerenciamento de dependências
Configuração
As configurações são gerenciadas através de:
- application.yml: Configurações principais
- Variáveis de ambiente: Configurações sensíveis e específicas do ambiente
- 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_*)