Sistema de Autenticação com Spring Security
Tags: springboot, springsecurity, java, backend
Published: 2023-08-05 14:04:22



## Introdução

Neste documento, apresento o sistema de autenticação desenvolvido usando o Spring Security em uma aplicação web chamada "BookCatalog". O objetivo do sistema é permitir que os usuários se autentiquem e acessem recursos protegidos na aplicação.
[Github](https://github.com/Benjamim-EP/SpringBoot-ValidationSecurity)

## Funcionalidades

O sistema de autenticação possui as seguintes funcionalidades:

1. **Registro de Usuários:** Os usuários podem se registrar na aplicação fornecendo um nome de usuário, e-mail e senha.

2. **Autenticação:** Os usuários registrados podem fazer login usando seu e-mail e senha para acessar recursos protegidos.

3. **Token JWT:** Após a autenticação bem-sucedida, o sistema fornece um token JWT (JSON Web Token) que contém informações adicionais do usuário, como o primeiro nome e o ID.

4. **Acesso a Recursos Protegidos:** O token JWT é usado para autenticar solicitações subsequentes para recursos protegidos no servidor.

## Motivação para o Uso do Spring Security

O Spring Security é um módulo poderoso do Spring Framework projetado para fornecer segurança em aplicativos corporativos. Nossa escolha pelo uso do Spring Security para implementar o sistema de autenticação se baseia nos seguintes motivos:

1. **Fácil Integração:** O Spring Security é altamente integrado ao ecossistema do Spring, o que facilita a integração com outros componentes da aplicação.

2. **Configuração Flexível:** O Spring Security oferece uma configuração flexível, permitindo a personalização das regras de segurança e a autenticação usando diferentes mecanismos.

3. **Fluxo OAuth2:** O Spring Security oferece suporte completo para o fluxo de autenticação OAuth2, permitindo a integração com provedores de identidade externos.

4. **Segurança Atualizada:** O Spring Security é uma biblioteca bem estabelecida, que é atualizada regularmente para lidar com novas ameaças de segurança.

## Processo de Login Detalhado

O processo de login no sistema de autenticação é composto pelos seguintes passos:

1. **Autenticação no Frontend:** O usuário insere suas credenciais (e-mail e senha) no frontend e envia a solicitação de login para o servidor.

2. frontend envia uma requisição para o backend com informações de login (Camada resource)
	
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3dwns1yu39gllm5x3n4.png)
3.  Envia a requisição para a camada de serviços , onde usamos a função UserDetailsService personalizado para transmitir e recurperar as inforções no banco de dados
	
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lgpo4lz7g2r91qu1m1ff.png)

 4. Na camada repository é feita efetivamente a recuperação do usuario do banco de dados por meio do JPA 
	 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bitadz4kdph7r7xetdk.png)

5.  Depois da aplicação bem sucedida o token é fornecido pelo spring security
	
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khfdiso6zrp6dguu590r.png)
	

7. **Autenticação no Servidor:** O servidor recebe a solicitação de login e usa o `AuthenticationManager` do Spring Security para autenticar o usuário. Ele utiliza um `UserDetailsService` personalizado para recuperar as informações do usuário (como e-mail, senha e permissões) do banco de dados com base no e-mail fornecido.

8. **Geração do Token JWT:** Se as credenciais do usuário forem válidas, o servidor gera um token JWT usando o `JwtTokenEnhancer`. Essa classe é responsável por adicionar informações adicionais ao token JWT, como o primeiro nome e o ID do usuário.

9. **Resposta ao Frontend:** O servidor responde à solicitação de login com o token JWT no corpo da resposta. O frontend armazena o token de forma segura (por exemplo, em cookies) para uso em solicitações futuras.

10. **Acesso a Recursos Protegidos:** Nas solicitações futuras, o frontend inclui o token JWT no cabeçalho "Authorization" da solicitação, usando o esquema "Bearer". O servidor verifica a validade do token e permite o acesso aos recursos protegidos se a autenticação for bem-sucedida.

## Conclusão

O sistema de autenticação implementado usando o Spring Security fornece uma camada de segurança robusta para a aplicação "BookCatalog". Com suporte ao fluxo OAuth2 e a geração de tokens JWT, os usuários podem autenticar-se de forma segura e acessar recursos protegidos na aplicação.

O Spring Security oferece uma configuração flexível e é altamente integrado ao ecossistema do Spring, tornando-o uma escolha ideal para implementar recursos de segurança em aplicativos corporativos. Com ele, garantimos a proteção adequada dos dados dos usuários e a prevenção de acesso não autorizado aos recursos da aplicação.