Ir para o conteúdo principal

Estudo do sistema de Logs no sistema Consignação


Data de elaboração 04/09/05/2023
Responsável pelo estudo
  1. Emanuel Rufino Alcantara de Lima (Analista)
Equipe do estudo
  1. André Honório de Andrade Silva (Tecnico)
  2. Gezinéia Paula da Costa (Product Owner)
  3. Gustavo Felix (Analista)
  4. Rafael Passos dos Santos (Assessor)
  5. Alef Carvalho (Analista)
  6. Gustavo Felix (Analista)
Alvo Consignação
Origem

Implementação: Estudo do sistema de Logs no sistema Consignação

Objetivo

O presente estudo visa analisar como está sendo criado os logs do sistema Consignação. Dessa forma, utilizá-lo para adequar as necessidades de auditoria.

Documentação correlata
Observações O presente estudo pretende também pretende levantar as Historias dos cards para a Sprint 


1. Objetivo

O presente estudo visa analisar como está sendo criado os logs do sistema Consignação. Dessa forma, utilizá-lo para adequar as necessidades de auditoria.

1.1 JUSTIFICATIVA

Atualmente existe um sistema de logs no Consignação, porém a equipe Vingadores não tem conhecimento de como esse log é feito, por isso este estudo está sendo realizado.

1.2 RESULTADOS ESPERADOS

Espera-se que, após este estudo, seja possível levantar quais são os esforços necessários para adequar o modo que o log está sendo realizado no sistema Consignação para adequá-lo às necessidades de auditoria.

2. Introdução

O sistema Consignação necessita de mais informações no sistema de logs.

3. Desenvolvimento

3.1 CENÁRIO ATUAL

Para o início do estudo, foi identificada uma base de dados contendo os logs do sistema consignação.

image.pngimage.png

Tabela 1. Tabela de logs com dados anonimizados

Olhando o código fonte, foi identificado que essa base foi gerada através do framework SLF4J.

Framework SLF4J

O Simple Logging Facade for Java (SLF4J) é um framework de logging para a linguagem de programação Java. O objetivo do SLF4J é fornecer uma API simples e unificada para a criação e o registro de mensagens de log em uma variedade de bibliotecas de logging populares, como Log4j, JDK logging e Logback, com ele o desenvolvedor pode simplesmente escrever código para o SLF4J e o SLF4J lidará com a escolha e a configuração da biblioteca de logging apropriada.

Classe Logger

A classe Logger do pacote org.slf4j é uma interface de registro de eventos que permite que os aplicativos Java gerem mensagens de log em diferentes níveis de gravidade, como TRACE, DEBUG, INFO, WARN e ERROR. A interface Logger  fornece métodos para registrar mensagens de log em diferentes níveis de gravidade e incluir informações adicionais, como a origem da mensagem de log.

Classe LoggerFactory

A classe LoggerFactory faz parte do pacote org.slf4j, que é um framework de logging para a linguagem Java. O objetivo do LoggerFactory é fornecer uma instância de logger que pode ser usada para registrar mensagens em um arquivo de log.

Ao criar uma instância da classe Logger, o LoggerFactory é usado para fornecer uma implementação do logger apropriada para a plataforma em que o código está sendo executado. Isso significa que, em vez de criar uma instância do logger diretamente, é melhor criar uma instância usando o LoggerFactory.

A classe LoggerFactory possui vários métodos estáticos para criar instâncias do logger, incluindo:

  • getLogger(String name): cria uma instância do logger com o nome especificado.


  • getLogger(Class<?> clazz)
    : cria uma instância do logger para a classe especificada.

Além disso, o LoggerFactory pode ser configurado para usar diferentes implementações do logger, dependendo das necessidades do aplicativo. Por exemplo, é possível configurar o LoggerFactory para usar o Log4j em vez do logger padrão do SLF4J. Isso é feito editando o arquivo de configuração slf4j.properties ou logback.xml para incluir as dependências do Log4j e alterar a configuração do logger padrão.

 

Método Salvar na classe TipoDeVerbaServico

Para identificar o funcionamento do SLF4Jlog foi utilizado o método Salvar da classe TipoDeVerbaServico. Nessa classe, foi possível identificar o salvamento do log, através da utilização do método registrar, da classe LogServico.

image.pngimage.png

Imagem 2. Exemplo de criação de logs no salvamento do Tipo de Verba

Classe LogServico

A classe LogServico trata das regras de negócio dos logs do sistema. Ela é responsável por registrar logs de operações realizadas em entidades do sistema, através da persistência de objetos do tipo LogJson.

O serviço é composto por dois métodos:

  1. O método registrar, que recebe como parâmetros uma entidade (que pode ser qualquer objeto do sistema), um funcionário, uma enumeração LogJsonOperacaoEnum, que representa a operação realizada (CREATE, UPDATE ou DELETE) e um guid da aplicação (nesse caso, do sistema consignação). Este método é responsável por recuperar o nome da tabela que representa a entidade passada como parâmetro e chamar um método para realizar o registro do log.
  2. O método recuperarEntidadeNome, que recebe como parâmetro uma entidade e é responsável por recuperar o nome da tabela que representa a entidade, a partir do uso da anotação @Table na classe da entidade.

Além disso, a classe LogServico possui uma classe interna chamada LogRegistrador, que implementa a interface Runnable. Essa classe é responsável por construir o objeto LogJson com as informações necessárias para ser persistido no banco de dados.

Classe LogRepositorioLogRegistrador

A classe LogRegistrador implementa a interface Runnable e é responsável por registrar operações de log em uma entidade, ou objeto, em um banco de dados.

O construtor da classe recebe uma instância de ILogJsonRepositorio que é uma interface para acesso ao banco de dados onde serão salvos os logs, um objeto que representa a entidade que sofrerá o log, um valor do tipo LogJsonOperacaoEnum que representa a operação que está sendo realizada (como criar, atualizar ou excluir a entidade), o nome da tabela em que a entidade está armazenada, o GID (identificador global) da aplicação que está realizando a operação, e o nome do funcionário responsável pela operação.

A classe também possui um método run() que é chamado quando a classe é executada em uma thread. Esse método realiza a validação dos campos obrigatórios da entidade e, caso todos os campos estejam preenchidos, cria uma string JSON que representa a entidade usando a biblioteca ObjectMapper, do Jackson, e a salva no banco de dados através da instância de ILogJsonRepositorio. Caso algum erro ocorra durante a execução, uma mensagem de erro é exibida no log da aplicação.

A classe LogServico possui também quatro classes internas que implementam as interfaces JsonSerializer e JsonDeserializer. Essas classes são utilizadas pelo ObjectMapper para serializar e deserializar os objetos do tipo LocalDateTime e LocalDate. Isso é necessário para que os valores desses campos sejam corretamente armazenados e recuperados no banco de dados.

Interface LogJsonRepositorio

A interface LogRepositorio fazé autilizada na persistência das informações no banco de dados. Ela é decorada com @Repository a qual permite utilizar os métodos padrões de CRUD (save, saveAll, exists, findAll, findById, deleteById, deleteAll, count, etc.)

image.png

 

 

3.2 SOLUÇÃO

UmConsiderando Fatora importanteanálise antesrealizada sobre o funcionamento do registro no sistema de aplicarconsignação, aconseguimos encontrar uma solução eviável entenderpara quea quaseinclusão todasdas informações requisitadas no registro de logs do banco de dados.

De acordo com a solicitação as modificaçseguintes informações serão feitasnecessárias:

no
- projetoIP
- DATA e HORA
- CPF do Servidor/CNPJ do funcionário
- String
Ter o registro de Front-End,toda emovimentação, que o códigoregistro de autenticaçãoquem efez autorizaçãoa atual talvez não seja possível reaproveitar muita coisa.

A Autenticação e Autorização ficam no arquivobaixa de "login.js"averbações localizadomanuais, nofechamento, projetoacesso deao Front-Endsistema, naqualquer pastaexclusão, "src/boot/login.js"

1. O primeiro passo é cadastrar o Consignaçcriação no sistema Meu Acesso e configurar as URLs de Localhost, Dev e QA.

2. Criar nova Tela Inicial com botão de Logincargo, cadastro de servidor(matricula), e verbas.

De acordo com o estudo anterior a respeito dos logs, essas informações podem ser obtidas conforme mencionado no documento.

3.Para Instalarque esses dados sejam persistidos, são necessárias as seguintes ações:

  1. Criar os campos: IP, CPF/CNPJ na tabela LogRegistrador.
  2. Adicionar esses campos no Consignaçãoconstrutor Front-Endda classe LogRegistrador.
  3. Verificar uma forma genérica de obter esses dados e passar para o Pacoteconstrutor. openid-clientSugestão: peloUtilizar Npma Package.

    classe

    4.AbstractServico Configuree criar os métodos para obter o OpenId-ClientIP e implementaro Call-BackCPF/CNPJ, conforme o exemplo abaixo:

public String getIpDoUsuario(){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String ip = request.getRemoteAddr();
        return ip;
    }

Na chamada

constString { Issuer, Client }ip = require('openid-client');

const providerMetadata = await Issuer.discover('https://your-provider.com');
const client = new Client({
  client_id: 'your-client-id',
  client_secret: 'your-client-secret',
  redirect_uris: ['https://your-app.com/callback'],
  response_types: ['code'],
  token_endpoint_auth_method: 'client_secret_basic',
  userinfo_endpoint: providerMetadata.userinfo_endpoint,
  issuer: providerMetadata.issuer,
}super.getIp();

5. Ajustar

Arquivo

 de Login.Js para funcionar com a Autenticação OpenId

3.2.1 PreocupaçConsiderações e soluçPreocupações 

Uma

    preocupação
  1. Ao quecontrário sedo deveestudo teranterior, e
  2. referente
  3. Esta será a Autorizaçprimeira alteração do acesso as páginas, quando realizar a trocabanco de Autenticaçãdados feita pelo time em projetos JAVA.
  4. Os novos campos dos registros passados ficarão poisem pode acontecer de aparecer alguns problemas de acesso que terão que ser corrigidos.

    Realizando a Autenticação com o Sauronbranco ou Gov.Brnulos.

  5. não
será

 possível manter a tela de Login Atual, terá que ser utilizado a tela do Sauron ou Gov.Br. Isso pode não ser muito aceito pelos clientes além do fato de um aumento na complexidade da autenticação e autorização pois de inicio a autenticação vai ser feito por um dos dois sistemas e a autorização ainda estará no Consignação, em caso de novos usuários será necessário cadastrar ele em um dos sistemas e na autorização do Consignação.

3.2 IMPLEMENTAÇÃO E HISTÓRIAS DE USUÁRIOS

O que? Pontos Regras Produto
CriarIncluir Sistemaos Consignaçãcampos IP, CPF/CNPJ na classe e migrar para o nobanco Meude Acesso Devdados 35

- ConfigurarVerificar URLse Localo ecampo Dev,cpf/cnpj QA

é

-necessário, Criarpois Perfil Padrãpossui o login do usuário na tabela, o que é suficiente para identificar o usuário

Consignação
Criar Tela

Adicionar Inicialos docampos Sistemano construtor da classe LogRegistrador e incluí-los em cada chamada

513

- CriarNo Telacódigo Inicialfoi dopossível Sistemaidentificar com55 botãochamadas para Loginesse ou alterar a tela de Login para a Inicial.

- Define essa tela como a primeira tela ao acessar o sistema.

- Mergir em Branch Separada do Devcódigo

Consignação
Instalar o Pacote OpenId no Consignação5  

- Instalar pelo npm o "openid-client" no Projeto Vue.Js

- Mergir em Branch Separada do Dev

Consignação
Utilizar e Configurar o OpenId Client8  

- Utilizar Accestoken e ClientId do Meu Acesso para Configurar.

- Configurar Callback.

- Mergir em Branch Separada do Dev

Consignação
Alterar o Arquivo de Login para funcionar com OpenId Client5

- src/boot/login.js

- Mergir no Dev

Consignação
Corrigir problemas de acesso as páginas?? Consignação

3.3 POSSÍVEIS IMPEDIMENTOS

A linguagem utilizada no projeto é nova para o time e nunca foi tentando realizar integração do Sauron em um sistema JAVA / Vue.Js que é o caso do Consignação. Além disso os arquivos de Autenticação não estão muito organizados

4. Conclusão

Conclui-seApós queuma éanálise possívelcuidadosa integrarsobre o funcionamento do registro no sistema Consignaçde consignação, conseguimos encontrar uma solução somenteprática come viável para incluir as informações necessárias no registro de logs do banco de dados. A criação Saurondos serácampos feitoIP somentee aCPF/CNPJ Autenticaçãona tabela LogRegistrador e a Autorizaçutilização aindada classe AbstractServico para obter esses dados de forma genérica são algumas das ações necessárias para garantir a persistência das informações. É importante lembrar que essa será feitoa aindaprimeira alteração no Consignação, Futuras funcionalidades serão necessárias, sendo elas uma Cadastro na Tela Inicial do Sistema, na telabanco de cadastrodados depelo Funcionáriotime cadastrarem oprojetos usuárioJAVA, no Sauron com E-mail valido parae que os registros anteriores ficarão mesmoem recebabranco aou senhanulos enos verificarnovos secampos todos os CPFs estão validos para vincular a autenticação com a Autorização.criados.