📚 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 pastaloginusuarios/como os irmãos_01/_02— a pasta do projeto se chamajavaweb_login_03_rbacsó por manter a numeração da série.
Trilha de Aprendizado — Projeto 3 de 4
- 01: Login/cadastro com role única (enum) · Bootstrap 5 · H2
- 02: Refatoração SOLID/DRY — camada de Service, DTOs, Bean Validation
- ➡️ 03 (este): RBAC muitos-para-muitos · painel admin · relatórios
- 04: Levantamento de Requisitos · Backlog & Sprints · Git Flow · testes · ADRs
🎓 Nível profissional simulado: Pleno. O modelo de permissões deixa de ser um
enumfixo e vira uma entidade própria (Rolemuitos-para-muitos comUser), 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.`
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.`
data/usuariosdb.mv.db, persistente entre execuções)`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.`
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.`
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.`
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
DataInitializerjá deixa comentado o ponto onde associarRoles ao admin (“Aqui você poderia criar e associar roles”). Sem nenhumaRole, o admin criado por padrão não tem nenhuma authority — vale como exercício conectar isso ao modelo de perfis já mapeado (User↔Role).`
cd cadastrousuarios03
./mvnw spring-boot:run
Acesse http://localhost:8080/login e entre com admin / admin.
—`
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd javaweb_login_03_rbac
./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