Я бы создал настроенный объект Authentication
и сохранил бы необходимую информацию внутри него.
Для пользовательских данных храните их Principal
. Для данных, не связанных с пользователем, звучит как Details
. Это хорошее место для хранения.
Многие встроенные AuthenticationProvider
создадут UserDetails
и сохранят в Principal
. Это означает, что вы можете просто создать таможенную UserDetails
, если вы используете встроенную AuthenticationProvider
.
Таким образом, в зависимости от того, как вы реализуете логику аутентификации, вам необходимо настроить соответствующие AuthenticationProvider
или Filter
и т. Д. Цель - получить доступ к HttpServletRequest
, получить JWT из заголовка HTTP, проанализировать JWT, настроить и настройте этот настроенный объект Authentication
и установите для него SecurityContext
:
SecurityContextHolder.getContext().setAuthentication(authenication);
Для доступа к этому Authentication
объекту в контроллере вы можете использовать:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
CurrentUser user = (CurrentUser) auth.getPrincipal();
CurrentRequestDetail detail= (CurrentRequestDetail) auth.getDetails();
/** CurrentUser and CurrentRequestDetail is the customised Principal and Details**/
Если вам нужен доступ только к [Principal
], вы можете использовать @AuthenticationPrincipal
:
@PostMapping("")
public Mono<User> login(@RequestBody User post,
@RequestParam String user_id,
@RequestParam String username,
@AuthenticationPrincipal CurrentUser currentUser) {
//Need to access information from JWT claims here
return this.repository.findById(user_id);
}