📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Backend com Java e Spring Boot. Recomendado revisar antes de começar.

🔑 Login de Usuários 03 — Cadastro com Perfis e Relatórios

Nota: o código-fonte real deste projeto vive em cadastrousuarios03/ (nome do módulo Maven), não em uma pasta loginusuarios/ como os irmãos _01/_02 — a pasta do projeto se chama javaweb_login_03_rbac só por manter a numeração da série.

Trilha de Aprendizado — Projeto 3 de 4

🎓 Nível profissional simulado: Pleno. O modelo de permissões deixa de ser um enum fixo e vira uma entidade própria (Role muitos-para-muitos com User), preparando o sistema para múltiplos papéis por usuário. Você também pensa em quem administra o sistema (painel de CRUD completo) e em quem precisa prestar contas dele (página de relatórios) — não só em quem faz login.`

🎯 Objetivo

Evolução do CRUD de usuários com Spring Security: em vez de só autenticar, este projeto administra usuários com perfis de acesso (Role, relação muitos-para-muitos), oferece uma tela de cadastro/edição/exclusão e uma página de relatório listando todos os usuários cadastrados.`

🛠️ Tecnologias

🏛️ Modelagem

erDiagram
    USERS ||--o{ USER_ROLES : possui
    ROLES ||--o{ USER_ROLES : concede

    USERS {
        Long id PK
        String username
        String password
        String email
    }
    ROLES {
        Long id PK
        String name
    }

User implementa UserDetails diretamente (não usa uma classe adaptadora separada) e Role implementa GrantedAuthority — assim o próprio modelo de domínio já fala a língua do Spring Security, sem uma camada de tradução extra.`

🔐 Segurança (SecurityConfig)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(authorize -> authorize
            .requestMatchers("/css/**", "/js/**").permitAll()
            .anyRequest().authenticated()
        )
        .formLogin(form -> form
            .loginPage("/login").permitAll()
            .defaultSuccessUrl("/", true)
        )
        .logout(logout -> logout.logoutSuccessUrl("/login"));
    return http.build();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

Login por formulário padrão do Spring Security, senhas com BCrypt (nunca em texto plano), e todas as rotas exigem autenticação exceto os assets estáticos e a própria página de login.

AuthorizationService implementa UserDetailsService buscando o usuário pelo username via UserRepository — é o ponto de integração entre o banco (JPA) e o filtro de autenticação do Spring Security.`

📋 Funcionalidades (UserController)

Rota Ação
GET / Lista todos os usuários + formulário de cadastro/edição
POST /save Cria ou atualiza um usuário
GET /edit/{id} Carrega um usuário no formulário para edição
GET /delete/{id} Remove um usuário
GET /login Tela de login
GET /relatorios Relatório com a lista completa de usuários cadastrados

💡 Detalhe de UX no /save: se o campo de senha vier vazio na edição, o controller mantém a senha atual em vez de sobrescrever com uma string vazia criptografada — sem essa checagem, editar qualquer outro campo do usuário (ex.: e-mail) acidentalmente apagaria a senha dele.`

🌱 Usuário Inicial (DataInitializer)

Um CommandLineRunner cria o usuário admin (senha admin) automaticamente na primeira execução, caso ele ainda não exista — sem isso, ninguém conseguiria logar na primeira vez, já que não existe rota pública de auto-cadastro.

⚠️ Nota de segurança didática: o DataInitializer já deixa comentado o ponto onde associar Roles ao admin (“Aqui você poderia criar e associar roles”). Sem nenhuma Role, o admin criado por padrão não tem nenhuma authority — vale como exercício conectar isso ao modelo de perfis já mapeado (UserRole).`

🏁 Executando o Projeto

cd cadastrousuarios03
./mvnw spring-boot:run

Acesse http://localhost:8080/login e entre com admin / admin.


Voltar para Projetos

—`

🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd javaweb_login_03_rbac

2. Execute a aplicação e os testes

./mvnw spring-boot:run
./mvnw test

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/javaweb_login_03_rbac