Este projeto visa a construção de uma aplicação bancaria digital, imposto pelo professor da instituição Softblue Cursos Online, Carlos Tosin. A aplicação possui um frontend em ReactJS que permite aos usuários realizarem operações de saques, depositos, e transferências, como também acesso ao extrado bancario. Todas estas requisições são realizadas diretamente ao backend construido em Java utilizando Spring Framework.
Após a importação do projeto, é necessário realizar algumas configurações básicas dependendo da IDE ou editor de código utilizado.
Adicionar as configurações a baixo ao arquivo launch.json.
{
//...
"console": "internalConsole",
"vmArgs": "-Dspring.profiles.active=dev"
}
Adicionar um VM arguments para JVM.
-Dspring.profiles.active=dev
A especificação acima de vmArgs
ou VM arguments
indica a JVM qual profile será utilizado na execução do projeto em modo desenvolvimento.
- Erros de input são exibidos no próprio elemento, via atributo title.
- O usuário sempre é desconectado na tentativa de alguma requisição com token expirado.
- Erros de validação de formulários gerados pelo servidor, são retornados ao cliente e repassados o hook
useForm
para tratativa visual das mensagens de erro. - Visando uma melhor experiência para o usuário, o tamanho minimo de tela aceitável para está aplicação é de 800x600.
- Adicionado número da conta, CPF, ou CNPJ como opções de acesso, visando mais praticidade ao usuário na tentativa de autenticação.
- Classe
UserLogon
recebe os dados de login, tornando-se um objeto pronto para ser utilizado no serviço de autenticação.
- Criar um filtro de autenticação para validar o objeto
UserLogon
antes de qualquer outro. - Quando a aplicação esta em execução, o Spring executa o filtro para qualquer rota solicitada, bloqueando o acesso as rotas publicas.
- Falha na tentativa leitura da InputStream no filtro de segurança de
UserLogon
. InputStream encontra-se fechada e/ou já consumida pelo Spring.
- EntryAuthenticationFilter: Primeiro da cadeia de filtros de segurança, com a lógica de validação do objeto
UserLogon
. - shouldNotFilter: Método que indica se o filtro deve ser executado. O método foi sobrescrito, possuindo uma lógica única que valida somente as rotas protegidas.
- RequestWrapper: Provê a possíblidade de leitura do conteúdo da InputStream, e permite repassa-la novamente para a cadeia de filtros sem nenhum bloqueio.
Controle de autenticação implementado com JSON Web Tokens (JWT).
- Informar ao cliente de forma clara os erros do processo de autenticação ou autorização gerados no filtro de segurança.
- Exceptions lançadas por filtros, não são capturadas pela classe
WebRequestExceptionHandler
. - Quando o usuário é desconectado, seu token ainda continua sendo valido até a expiração.
- Excesso tokens inválidos armazenados no banco de dados.
- Criado dois métodos especificos na classe
WebRequestExceptionHandler
para capturar as exceptionsExpiredJwtException
eBlockedTokenException
e retornar ao cliente uma mensagem customizada. - Implementado a classe
JWTAuthenticationEntryPoint
e adicionada as configurações doWebSecurityConfig
para ser o objeto de entrada para qualquer exception lançada pelos filtros. Sendo assim o tipo da exceção é identificada e encaminhada aoWebRequestExceptionHandler
via objetoHandlerExceptionResolver
. - Adicionado ao controller um endpoint especifico para logout. A chamada ao endpoint é realizada passando o JWT como parametro. Desta forma o token é armazenado em uma blacklist table, que é consultada em toda requisição.
- Para evitar este acumolo desnecessário, foi implementado uma rotina na classe
ScheduledTasks
, que realiza a exclusão de tokens expirados.
AccountCard: Componente responsável por exibir o saldo de cada conta do usuário, podendo ser ocultado/exibido, com salvamento do state em Local Storage.
Visando a usabilidade dos recursos da página de extrato, foi criado o componente StatementListTable
. Este componente recebe um objeto do hook useStatements
e realiza a construção de uma tabela com as informações da conta especificada. Também é possível exportar o extrato, realizar impressão, e alterações na exibição de colunas.
Com base nos dados de transferência informado pelo usuário, é possível também realizar um agendamento futuro. As transferências agendadas são verificadas diariamente pela rotina implementada na classe ScheduledTasks
.
- Transferências agendadas e que não sejam o ultimo movimento da tabela, estão afetando a ordem dos registros no extrato.
- Tentativa de transferência agendada com saldo insuficiente.
- Nova coluna (sequence) adicionada a tabela. O valor da coluna sempre é atualizado no momento de efitivação do agendamento. Os registros agora são ordenados no extrato com base na coluna sequence.
- Neste caso, é registrado no extrato do usuário um movimento constando a tentativa de transferência. Toda lógica é realizada em
ScheduledTasks
.
A construção destas duas telas foram desenvolvidas sobre a possibilidade do usuário realizar operações com uma moeda virtual do próprio banco. Além disso, todos os depósitos realizados a partir de 18:00h são compensados no dia seguinte.
- O desenvolvimento da moeda.
- A utilização da moeda deve ser única, sem a possíbilidade de reutilizações.
- Gerar a moeda em um tipo de arquivo que seja possível a leitura pelo usuário e também pelo sistema.
- Como realizar o envio da moeda na tela de depósito?
- Construção e impressão de um comprovante de depósito.
- Realizado a construção de um tipo de papel moeda virtual. Este recurso possui um QR Code que é gerado a partir de um serviço terceiro, e que é analisado no momento do depósito.
- Todo BlueCoin gerado via saque é armazenado em uma tabela do banco de dados. Assim que uma tentativa de depósito é realizada, as informações desta moeda é verificada com a tabela do banco de dados, evitando uma tentativa de reutilização.
- Utilizado a lib
dom-to-image
que realiza um tipo de parse de um nó HTML para um imagem. - Os dados do formulário de depósito foram encriptados com tipo
multipart/form-data
. Com este tipo de encriptação, foi possível enviar a moeda ao servidor junto com os demais dados da requisição. Já no servidor, foi utilizado oWebClient
do Spring, que conecta com serviço terceiro e realiza o parse da moeda. - Através do componente
Receipt
, é gerado um comprovante contendo as informações básicas do saque realizado. Para o recurso de impressão, foi utilizado a libreact-to-print
, que basicamente realiza uma impressão de um componente especificado.
Páginas similares, que utilizam os hooks useCities
e useStates
. Estes hooks retornam um listagem de estados e cidades diretamente da base de dados do IBGE.
Material UI, Momement JS, Axios, DOM to Image, JWT Decode, Node Sass, Object to Formdata, React Hook Form, React Icons, React Number Format, React Responsive, Yup, IBGE API.