Skip to content

Latest commit

 

History

53 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔐 Spring Security com Java 25 – Autenticação e Autorização com Roles + Token JWT + Fetch


📌 Sobre o projeto

Este projeto é um exemplo completo de aplicação web utilizando Spring Boot, Spring Security, Java 25, Token JWT, Fetch com JS e um banco de dados MySQL.
É também temos um frontend com Html e Css com um pouco de js
Neste projeto, utilizei roles para autenticar rotas que o usuário comum não tem permissão para acessar, como as rotas (/auth) e (/users).
O JWT é utilizado para gerar um token quando o usuário realiza o login. Atenção! O usuário que faz login na rota de autenticação, nesse caso a rota de autenticação e (/auth), não tem relação com o usuário que faz login na rota de login que é a rota (/signin).
O usuário que faz login na rota (/signin), primeiro precisa se cadastrar no banco de dados. então ele acessa a rota (/register) e faz o cadastro do usuário.
Neste caso estamos utilizando um banco de dados MySQL, e vou mostrar mais em frente como criar esse banco de dados.
Já as nossas ROLES são criada via CommandLineRunner e só da run no projeto ela já criada, Vamos usar Thymeleaf para retornar nossos templates, e o controle de acesso será feito com Spring MVC.


🚀 Tecnologias utilizadas

  • Java 25
  • Spring Boot
  • Spring Security
  • Thymeleaf
  • Maven
  • JWT (JSON WEb TOKEN)
  • Spring Data Jpa
  • MySQL
  • Spring Boot Devtools
  • Lombok
  • Validation
  • Html e css
  • JS

🔒 Segurança

  • Senhas armazenadas de forma criptografada utilizando BCrypt
  • Geração de token JWT no processo de login
  • Autenticação de credenciais realizada via Controller no Back-end
  • Autorização baseada em ROLES utilizando Spring Security
  • Controle de acesso às rotas feito com base nas ROLES do usuário
  • Rotas sensíveis protegidas pelo Spring Security

Este projeto retorna o token JWT na resposta de login.
Em aplicações de produção, recomenda-se o uso de cookies HttpOnly para armazenamento do token.


📂 Estrutura do projeto

src/
├── main
│   ├── java
│   │   └── br
│   │       └── com
│   │           └── carlos
│   │               └── api
│   │                   ├── ProjetoApiApplication.java
│   │                   ├── controller
│   │                   │   ├── AppController.java
│   │                   │   └── UsuarioController.java
│   │                   ├── dto
│   │                   │   └── LoginRequest.java
│   │                   ├── model
│   │                   │   ├── Role.java
│   │                   │   ├── UserAuth.java
│   │                   │   └── Usuario.java
│   │                   ├── repository
│   │                   │   ├── IRole.java
│   │                   │   ├── IUserAuth.java
│   │                   │   └── IUsuario.java
│   │                   ├── security
│   │                   │   └── SecurityConfig.java
│   │                   ├── service
│   │                   │   ├── UserDetailsServiceImpl.java
│   │                   │   └── UsuarioService.java
│   │                   └── token
│   │                       ├── Token.java
│   │                       └── TokenUtil.java
│   └── resources
│       ├── application.properties
│       ├── static
│       │   ├── css
│       │   │   ├── auth.css
│       │   │   ├── cadastro.css
│       │   │   ├── home.css
│       │   │   └── signin.css
│       │   ├── img
│       │   │   ├── calabresa.jpg
│       │   │   └── header
│       │   │       ├── garfo1.png
│       │   │       ├── imager-header.jpg
│       │   │       └── menu-harburger.png
│       │   └── js
│       │       ├── cadastro.js
│       │       ├── home.js
│       │       └── signin.js
│       └── templates
│           ├── auth.html
│           ├── cadastro.html
│           ├── error.html
│           ├── home.html
│           └── signin.html
└── test
    └── java
        └── br
            └── com
                └── carlos
                    └── api
                        └── ProjetoApiApplicationTests.java


⚙️ Configuração do application.properties

spring.application.name=PROJETO-API
spring.datasource.username = root
spring.datasource.password = password
spring.datasource.url = jdbc:mysql://localhost:3306/name_DB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

⚙️ Como executar

Pré-requisitos

  • Java 25
  • Maven 3.8.3
  • git

Passo a passo

  1. clone o repositorio

     git clone https://github.com/Carlos-Henrique-devv/Projeto-loja-online.git
     cd Projeto-loja-online
  2. Cria DB + tablelas + colunas padrão.

    script:

    create database projeto_api;
    
    use projeto_api;
    
    create table users(
       id INTEGER PRIMARY KEY AUTO_INCREMENT,  
       name VARCHAR(200) NOT NULL,  
       surname VARCHAR(200),  
       username VARCHAR(100) NOT NULL UNIQUE,  
       email VARCHAR(50) NOT NULL UNIQUE,  
       password VARCHAR(100) NOT NULL UNIQUE,  
       phone VARCHAR(15) NOT NULL UNIQUE  
    );
    
    create table roles(
       id INTEGER PRIMARY KEY AUTO_INCREMENT, 
       name VARCHAR(100) NOT NULL UNIQUE
    );
    
    create table perm(
       id INTEGER PRIMARY KEY AUTO_INCREMENT, 
       username VARCHAR(100) NOT NULL UNIQUE,
       password VARCHAR(100) NOT NULL
    );
    
    CREATE TABLE perm_roles (
     user_id INT NOT NULL,
     role_id INT NOT NULL,
     PRIMARY KEY (user_id, role_id)
    );
    
  3. Agora e só copia esse script é cola no seu servidor MySQL

  4. Acessa o projeto e da um run

  5. Funcionalidades logo abaixo no fluxo de autenticação


🔐 Fluxo de autenticação

  1. O usuário se cadastra no sistema (/register)

  2. O usuário faz login (/signin)

  3. O backend valida as credenciais

  4. Um token JWT é gerado

  5. O token é enviado para o frontend

  6. O usuário é autenticado com sucesso

  7. Ao acessar (/users), a rota só pode ser acessada por usuários que tenham autorização

  8. Caso não esteja autorizado, será redirecionado para a rota (/login), página de interceptação do Spring Security

  9. Usuário padrão autenticado: User: "admin", Senha: "Admin123."

  10. Será possível visualizar o usuário cadastrado que você criou

About

An iFood-based website for a pizzeria.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages