harden user filters

This commit is contained in:
2026-03-14 22:06:49 -06:00
parent 9d48692857
commit 972c090b41
3 changed files with 30 additions and 7 deletions

View File

@@ -27,7 +27,7 @@ public class UserController {
@GetMapping
public ResponseEntity<Page<UserResponse>> getAllUsers(
@RequestParam(required = false) String q,
@RequestParam(required = false) User.Role role,
@RequestParam(required = false) String role,
Pageable pageable) {
return ResponseEntity.ok(userService.getAllUsers(q, role, pageable));
}

View File

@@ -2,6 +2,7 @@ package com.petshop.backend.security;
import com.petshop.backend.entity.User;
import com.petshop.backend.repository.UserRepository;
import io.jsonwebtoken.JwtException;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
@@ -41,7 +42,13 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
}
jwt = authHeader.substring(7);
Long userId = jwtUtil.extractUserId(jwt);
Long userId;
try {
userId = jwtUtil.extractUserId(jwt);
} catch (JwtException | IllegalArgumentException ex) {
writeUnauthorized(response, "Invalid or expired token");
return;
}
if (userId != null && SecurityContextHolder.getContext().getAuthentication() == null) {
User user = userRepository.findById(userId).orElse(null);

View File

@@ -13,6 +13,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;
import java.util.Locale;
import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.CONFLICT;
@Service
@@ -28,15 +31,16 @@ public class UserService {
this.userBusinessLinkageService = userBusinessLinkageService;
}
public Page<UserResponse> getAllUsers(String query, User.Role role, Pageable pageable) {
public Page<UserResponse> getAllUsers(String query, String role, Pageable pageable) {
User.Role parsedRole = parseRole(role);
Page<User> users;
boolean hasQuery = query != null && !query.trim().isEmpty();
if (hasQuery && role != null) {
users = userRepository.searchUsersByRole(query, role, pageable);
if (hasQuery && parsedRole != null) {
users = userRepository.searchUsersByRole(query, parsedRole, pageable);
} else if (hasQuery) {
users = userRepository.searchUsers(query, pageable);
} else if (role != null) {
users = userRepository.findByRole(role, pageable);
} else if (parsedRole != null) {
users = userRepository.findByRole(parsedRole, pageable);
} else {
users = userRepository.findAll(pageable);
}
@@ -147,4 +151,16 @@ public class UserService {
String trimmed = value.trim();
return trimmed.isEmpty() ? null : trimmed;
}
private User.Role parseRole(String role) {
String normalizedRole = trimToNull(role);
if (normalizedRole == null) {
return null;
}
try {
return User.Role.valueOf(normalizedRole.toUpperCase(Locale.ROOT));
} catch (IllegalArgumentException ex) {
throw new ResponseStatusException(BAD_REQUEST, "Invalid value for parameter: role");
}
}
}