Я бы хотел написать пользовательскую аннотацию в Spring Boot, которая возвращает текущего пользователя, отправляющего запрос в мой бэкэнд.
Я уже могу получить пользователя в контроллере с помощью:
@GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "Searches for a specific function by name or psc", notes = "Displays a desired function with the specified name or psc.")
public List<FunctionTO> getFunctionsByNameOrPsc(@RequestParam(name = "q") String query, @AuthenticationPrincipal Jwt jwt) {
String user = jwt.getClaims().get("preferred_username").toString();
return mapper.toFunctionTOList(functionsService.getFunctionsByNameOrPsc(query));
}
Но я хотел бы создать аннотацию, обрабатывающую мой JWT-токен, получая из него имя пользователя и возвращая меня узел «Пользователь» в базе данных.
Что-то вроде:
Контроллер:
@GetMapping(path = "", produces = MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "Searches for a specific function by name or psc", notes = "Displays a desired function with the specified name or psc.")
public List<FunctionTO> getFunctionsByNameOrPsc(@RequestParam(name = "q") String query, @User User user) {
System.out.println(user.getName()); // Prints username from node
return mapper.toFunctionTOList(functionsService.getFunctionsByNameOrPsc(query));
}
Аннотация
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface User {
}
Логика аннотации c выполнить
public class UserAnnotationImpl {
@Autowired
UsersRepository usersRepository;
private User getUser(@AuthenticationPrincipal Jwt jwt) {
String username = jwt.getClaims().get("preferred_username").toString();
return usersRepository.findById(username)
.orElseThrow(new UsernameNotFoundException());
}
}
Как я могу или могу это сделать?