1+ // src/main/java/com/virtusconsultoria/controllers/AuthenticationController.java
12package com .virtusconsultoria .controllers ;
23
34import com .virtusconsultoria .configsecurity .TokenService ;
910import com .virtusconsultoria .model .Administrador ;
1011import com .virtusconsultoria .model .Colaborador ;
1112import com .virtusconsultoria .model .Supervisor ;
13+ import com .virtusconsultoria .service .AuthorizationService ;
14+ import jakarta .servlet .http .Cookie ;
15+ import jakarta .servlet .http .HttpServletRequest ;
16+ import jakarta .servlet .http .HttpServletResponse ;
1217import jakarta .validation .Valid ;
1318import org .springframework .beans .factory .annotation .Autowired ;
1419import org .springframework .http .HttpStatus ;
1924import org .springframework .security .core .userdetails .UserDetails ;
2025import org .springframework .web .bind .annotation .*;
2126
27+ import java .util .Map ;
28+
2229@ RestController
2330@ RequestMapping ("/auth" )
2431public class AuthenticationController {
@@ -29,30 +36,114 @@ public class AuthenticationController {
2936 @ Autowired
3037 private TokenService tokenService ;
3138
39+ @ Autowired
40+ private AuthorizationService authorizationService ;
41+
3242 @ PostMapping ("/login" )
33- @ ResponseStatus (HttpStatus .CREATED )
34- public ResponseEntity <LoginUserResponse > login (@ RequestBody @ Valid LoginRequestDto loginDto ) {
35- var usernamePassword = new UsernamePasswordAuthenticationToken (loginDto .email (), loginDto .senha ());
36- Authentication auth = this .authenticationManager .authenticate (usernamePassword );
43+ @ ResponseStatus (HttpStatus .OK )
44+ public ResponseEntity <LoginUserResponse > login (
45+ @ RequestBody @ Valid LoginRequestDto loginDto ,
46+ HttpServletResponse response
47+ ) {
48+ var usernamePassword = new UsernamePasswordAuthenticationToken (
49+ loginDto .email (),
50+ loginDto .senha ()
51+ );
52+ Authentication auth = authenticationManager .authenticate (usernamePassword );
53+
54+ UserDetails userDetails = (UserDetails ) auth .getPrincipal ();
55+
56+ // Gera tokens
57+ String accessToken = tokenService .gerarAccessToken (userDetails );
58+ String refreshToken = tokenService .gerarRefreshToken (userDetails .getUsername ());
59+
60+ // Define cookies httpOnly
61+ Cookie accessCookie = criarCookie ("accessToken" , accessToken , 15 * 60 ); // 15 min
62+ Cookie refreshCookie = criarCookie ("refreshToken" , refreshToken , 7 * 24 * 60 * 60 ); // 7 dias
63+
64+ response .addCookie (accessCookie );
65+ response .addCookie (refreshCookie );
66+
67+ // Retorna dados públicos do usuário
68+ Object userResponseDto = montarUserResponse (auth .getPrincipal ());
69+
70+ return ResponseEntity .ok (new LoginUserResponse (null , userResponseDto ));
71+ }
72+
73+ @ PostMapping ("/refresh" )
74+ public ResponseEntity <?> refresh (
75+ @ CookieValue (name = "refreshToken" , required = false ) String refreshToken ,
76+ HttpServletResponse response
77+ ) {
78+ if (refreshToken == null ) {
79+ return ResponseEntity .status (HttpStatus .UNAUTHORIZED )
80+ .body ("Refresh token não fornecido" );
81+ }
82+
83+ return tokenService .validarRefreshToken (refreshToken )
84+ .map (email -> {
85+ UserDetails userDetails = authorizationService .loadUserByUsername (email );
86+ String newAccessToken = tokenService .gerarAccessToken (userDetails );
87+
88+ Cookie accessCookie = criarCookie ("accessToken" , newAccessToken , 15 * 60 );
89+ response .addCookie (accessCookie );
3790
38- System .out .println ("UserNamePassword" + usernamePassword );
39-
40- // Gera o token com o usuário autenticado (que pode ser de qualquer tipo)
41- var token = tokenService .gerarToken ((UserDetails ) auth .getPrincipal ());
91+ return ResponseEntity .ok ().body ("Token renovado com sucesso" );
92+ })
93+ .orElseGet (() -> ResponseEntity .status (HttpStatus .UNAUTHORIZED )
94+ .body ("Refresh token inválido ou expirado" ));
95+ }
96+
97+ @ PostMapping ("/logout" )
98+ public ResponseEntity <?> logout (
99+ @ CookieValue (name = "refreshToken" , required = false ) String refreshToken ,
100+ HttpServletResponse response
101+ ) {
102+ // Revoga refresh token
103+ if (refreshToken != null ) {
104+ tokenService .revogarRefreshToken (refreshToken );
105+ }
106+
107+ // Limpa cookies
108+ Cookie accessCookie = criarCookie ("accessToken" , "" , 0 );
109+ Cookie refreshCookie = criarCookie ("refreshToken" , "" , 0 );
110+
111+ response .addCookie (accessCookie );
112+ response .addCookie (refreshCookie );
113+
114+ return ResponseEntity .ok ("Logout realizado com sucesso" );
115+ }
42116
43- // Pega o objeto principal (o usuário completo)
44- Object principal = auth .getPrincipal ();
45- Object userResponseDto = null ;
117+ @ GetMapping ("/me" )
118+ public ResponseEntity <?> getCurrentUser (Authentication authentication ) {
119+ if (authentication == null || !authentication .isAuthenticated ()) {
120+ return ResponseEntity .status (HttpStatus .UNAUTHORIZED ).build ();
121+ }
122+
123+ Object principal = authentication .getPrincipal ();
124+ Object userResponseDto = montarUserResponse (principal );
125+
126+ return ResponseEntity .ok (Map .of ("user" , userResponseDto ));
127+ }
46128
47- // Verifica qual é o tipo do usuário para criar o DTO de resposta correto
129+ private Cookie criarCookie (String nome , String valor , int maxAge ) {
130+ Cookie cookie = new Cookie (nome , valor );
131+ cookie .setHttpOnly (true );
132+ cookie .setSecure (true ); // HTTPS apenas em produção
133+ cookie .setPath ("/" );
134+ cookie .setMaxAge (maxAge );
135+ cookie .setAttribute ("SameSite" , "Strict" );
136+ return cookie ;
137+ }
138+
139+ private Object montarUserResponse (Object principal ) {
48140 if (principal instanceof Administrador user ) {
49- userResponseDto = new AdministradorResponseDto (user );
141+ return new AdministradorResponseDto (user );
50142 } else if (principal instanceof Supervisor user ) {
51- userResponseDto = new SupervisorResponseDto (user );
143+ return new SupervisorResponseDto (user );
52144 } else if (principal instanceof Colaborador user ) {
53- userResponseDto = new ColaboradorResponseDto (user );
145+ return new ColaboradorResponseDto (user );
54146 }
55-
56- return ResponseEntity .ok (new LoginUserResponse (token , userResponseDto ));
147+ return null ;
57148 }
58149}
0 commit comments