📚 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
📁 Código deste projeto:
web-spring/(os caminhos citados abaixo são relativos à subpasta).
🧬 De onde vem o código: a partir desta parte, a trilha Login troca de base de código. Os projetos 01 e 02 usam o módulo
loginusuarios/(pacotebr.com.curso.loginusuarios); este projeto e o 04 evoluem o código do Cadastro de Usuários 02, por isso vivem emcadastrousuarios03/com o pacotebr.com.cadastro.usuarios. A numeração 03 segue a trilha pedagógica de Login, não a linhagem do código. Compare este projeto com o Cadastro 02 para ver exatamente o que foi acrescentado (RBAC muitos-para-muitos, painel admin e relatório).
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 catalogo_projetos/javaweb_login_03_rbac/web-spring
./mvnw spring-boot:run
No Windows (PowerShell):
cd catalogo_projetos\javaweb_login_03_rbac\web-spring
.\mvnw.cmd spring-boot:run
http://localhost:8080/login e autentique-se com admin / admin.http://localhost:8080/relatorios para auditar a lista consolidada de usuários e papéis.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 catalogo_projetos/javaweb_login_03_rbac