perubahan struktur response

This commit is contained in:
Wanda 2024-11-20 15:36:04 +07:00
parent 2b8de7a320
commit c8fe5bb235
9 changed files with 93 additions and 47 deletions

@ -1,6 +1,7 @@
package id.co.anaheim.gateway.span.config;
import com.google.gson.Gson;
import id.co.anaheim.gateway.span.models.BasicResponse;
import id.co.anaheim.gateway.span.models.JwtUsername;
import id.co.anaheim.gateway.span.models.JwtValidationResult;
import id.co.anaheim.gateway.span.services.JwtService;
@ -19,7 +20,6 @@ import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.HashMap;
@Slf4j
@Component
@ -48,6 +48,10 @@ public class JwtAuthFilter extends OncePerRequestFilter {
if (isWhitelisted) {
filterChain.doFilter(request, response);
} else {
BasicResponse basicResponse = new BasicResponse();
basicResponse.setFileName("");
basicResponse.setResultCode("403");
Gson gson = new Gson();
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
JwtUsername userName = jwtService.extractUsername(token);
@ -64,31 +68,31 @@ public class JwtAuthFilter extends OncePerRequestFilter {
log.info("Security Context: {}", SecurityContextHolder.getContext().getAuthentication());
filterChain.doFilter(request, response);
} else {
HashMap<String, String> map = new HashMap<>();
map.put("message", validationResult.getMessage());
Gson gson = new Gson();
basicResponse.setResultStatus(validationResult.getStatus());
basicResponse.setResultDescription(validationResult.getDescription() );
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentType("application/json");
response.getWriter().write(gson.toJson(map));
response.getWriter().write(gson.toJson(basicResponse));
response.getWriter().flush();
}
} else {
HashMap<String, String> map = new HashMap<>();
map.put("message", userName.getMessage());
Gson gson = new Gson();
basicResponse.setResultStatus(userName.getStatus());
basicResponse.setResultDescription(userName.getDescription() );
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentType("application/json");
response.getWriter().write(gson.toJson(map));
response.getWriter().write(gson.toJson(basicResponse));
response.getWriter().flush();
}
} else {
HashMap<String, String> map = new HashMap<>();
map.put("message", "Tidak ada authorization header");
Gson gson = new Gson();
basicResponse.setResultStatus("Tidak Memiliki Otorisasi");
basicResponse.setResultDescription("Tidak ada authorization header");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentType("application/json");
response.getWriter().write(gson.toJson(map));
response.getWriter().write(gson.toJson(basicResponse));
response.getWriter().flush();
}
}

@ -1,10 +1,7 @@
package id.co.anaheim.gateway.span.controllers;
import at.favre.lib.crypto.bcrypt.BCrypt;
import id.co.anaheim.gateway.span.models.AuthDto;
import id.co.anaheim.gateway.span.models.AuthResponse;
import id.co.anaheim.gateway.span.models.JwtExpiration;
import id.co.anaheim.gateway.span.models.User;
import id.co.anaheim.gateway.span.models.*;
import id.co.anaheim.gateway.span.repositories.UserRepository;
import id.co.anaheim.gateway.span.repositories.jdbc.JdbcUserRepository;
import id.co.anaheim.gateway.span.services.JwtService;
@ -31,30 +28,40 @@ public class AuthController {
@PostMapping("/login")
ResponseEntity<AuthResponse> login(@RequestBody AuthDto authDto) {
AuthResponse response = new AuthResponse();
AuthResponseDescription description = new AuthResponseDescription();
User user = repository.findByUsername(authDto.getUsername());
if (user == null) {
response.setMessage("Pengguna tidak ditemukan");
response.setResultCode("403");
response.setResultStatus("Tidak Memiliki Otorisasi");
description.setMessage("Username/Password tidak sesuai");
} else {
BCrypt.Result result = BCrypt.verifyer().verify(authDto.getPassword().toCharArray(), user.getPassword());
if (result.verified) {
response.setMessage("Berhasil masuk");
response.setId(user.getId());
response.setResultCode("401");
response.setResultStatus("Berhasil Login");
description.setMessage("Berhasil Masuk");
description.setId(user.getId());
String token = jwtService.generateToken(user);
response.setToken(token);
description.setToken(token);
JwtExpiration jwtExpiration = jwtService.extractExpiration(token);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
response.setTokenExpiration(dateFormat.format(jwtExpiration.getValue()));
description.setTokenExpiration(dateFormat.format(jwtExpiration.getValue()));
} else {
response.setMessage("Password tidak sesuai");
response.setResultCode("403");
response.setResultStatus("Tidak Memiliki Otorisasi");
description.setMessage("Username/Password tidak sesuai");
}
}
response.setResultDescription(description);
return ResponseEntity.ok(response);
}
@PostMapping("/register")
ResponseEntity<AuthResponse> createDefault() {
AuthResponse response = new AuthResponse();
AuthResponseDescription description = new AuthResponseDescription();
User user = repository.findByUsername("admin");
if (user == null) {
user = new User();
@ -66,12 +73,16 @@ public class AuthController {
user.setRole("ADMIN");
repository.create(user);
response.setMessage("Pendaftaran berhasil");
response.setId(user.getId());
response.setResultCode("Pendaftaran berhasil");
description.setMessage("Pendaftaran berhasil");
description.setId(user.getId());
response.setResultDescription(description);
return ResponseEntity.ok(response);
}
response.setMessage("Pengguna dengan username admin sudah ada");
response.setId(user.getId());
response.setResultCode("400");
description.setMessage("Pengguna dengan username admin sudah ada");
description.setId(user.getId());
response.setResultDescription(description);
return ResponseEntity.ok(response);
}
}

@ -4,8 +4,8 @@ import lombok.Data;
@Data
public class AuthResponse {
private String id;
private String token;
private String message;
private String tokenExpiration;
private String fileName;
private String resultCode;
private String resultStatus;
private AuthResponseDescription resultDescription;
}

@ -0,0 +1,11 @@
package id.co.anaheim.gateway.span.models;
import lombok.Data;
@Data
public class AuthResponseDescription {
private String id;
private String token;
private String message;
private String tokenExpiration;
}

@ -0,0 +1,11 @@
package id.co.anaheim.gateway.span.models;
import lombok.Data;
@Data
public class BasicResponse {
private String fileName;
private String resultCode;
private String resultStatus;
private String resultDescription;
}

@ -10,5 +10,6 @@ import java.util.Date;
public class JwtExpiration {
private boolean valid;
private Date value;
private String message;
private String status;
private String description;
}

@ -8,5 +8,6 @@ import lombok.Data;
public class JwtUsername {
private boolean valid;
private String value;
private String message;
private String status;
private String description;
}

@ -9,5 +9,6 @@ import lombok.Data;
public class JwtValidationResult {
private Claims claims;
private boolean valid;
private String message;
private String status;
private String description;
}

@ -63,11 +63,11 @@ public class JwtService {
public JwtValidationResult validateToken(String token, UserDetails userDetails) {
JwtExpiration expirationDate = extractExpiration(token);
if (!expirationDate.isValid() || (expirationDate.getValue() != null && expirationDate.getValue().before(new Date()))) {
return JwtValidationResult.builder().message("JWT token is expired").valid(false).build();
return JwtValidationResult.builder().status("Tidak Memiliki Otorisasi").description("Token yang Digunakan Expired").valid(false).build();
}
JwtUsername username = extractUsername(token);
if (!username.isValid()) {
return JwtValidationResult.builder().message(username.getMessage()).valid(false).build();
return JwtValidationResult.builder().status(username.getStatus()).description(username.getDescription()).valid(false).build();
}
boolean valid = userDetails.getUsername().equals(username.getValue()) && !expirationDate.getValue().before(new Date());
return JwtValidationResult.builder().valid(valid).build();
@ -79,7 +79,7 @@ public class JwtService {
Date value = result.getClaims().getExpiration();
return JwtExpiration.builder().value(value).valid(true).build();
}
return JwtExpiration.builder().message(result.getMessage()).valid(false).build();
return JwtExpiration.builder().description(result.getDescription()).status(result.getStatus()).valid(false).build();
}
public JwtUsername extractUsername(String token) {
@ -88,7 +88,7 @@ public class JwtService {
String value = result.getClaims().getSubject();
return JwtUsername.builder().value(value).valid(true).build();
}
return JwtUsername.builder().message(result.getMessage()).valid(false).build();
return JwtUsername.builder().description(result.getDescription()).valid(false).build();
}
public String extractStaticToken(String token) {
@ -100,27 +100,33 @@ public class JwtService {
}
public JwtValidationResult getAllClaimsFromToken(String token) {
String message = "";
String description = "";
String status = "";
try {
Claims claims = Jwts.parserBuilder().setSigningKey(getSignKey()).build().parseClaimsJws(token).getBody();
return JwtValidationResult.builder().valid(true).claims(claims).message(message).build();
return JwtValidationResult.builder().valid(true).claims(claims).description(description).status(status).build();
} catch (MalformedJwtException e) {
log.error("Invalid JWT token: {}", e.getMessage());
message = "JWT token tidak sesuai";
status = "Tidak Memiliki Otorisasi";
description = "Token yang Digunakan Salah";
} catch (ExpiredJwtException e) {
log.error("JWT token is expired: {}", e.getMessage());
message = "JWT token telah kadaluarsa";
status = "Tidak Memiliki Otorisasi";
description = "Token yang Digunakan Expired";
} catch (UnsupportedJwtException e) {
log.error("JWT token is unsupported: {}", e.getMessage());
message = "JWT token tidak didukung";
status = "Tidak Memiliki Otorisasi";
description = "Token yang Digunakan Salah";
} catch (IllegalArgumentException e) {
log.error("JWT claims string is empty: {}", e.getMessage());
message = "String JWT claims kosong";
status = "Tidak Memiliki Otorisasi";
description = "Token yang Digunakan Salah";
} catch (Exception e){
log.error("Invalid JWT token");
message = "JWT token tidak sesuai";
status = "Tidak Memiliki Otorisasi";
description = "Token yang Digunakan Salah";
}
return JwtValidationResult.builder().valid(false).message(message).build();
return JwtValidationResult.builder().valid(false).description(description).status(status).build();
}
private String createToken(Map<String, Object> claims, String username) {