Я создаю токен JWT и в одно из утверждений помещаю свой UserDetails.
@Override
//Create the JWT token for portalusers
public String createToken(PortalUser portalUser){
log.info("Create token log");
//Get uuid from portaluser
String uuid = portalUser.getUuid();
//Get UserDetails
UserDetails userDetails = authService.getUserDetailsByUuid(uuid);
//Set claims for the jwt token with information about the portaluser
Claims claims = Jwts.claims().setSubject(uuid);
claims.put(ROLE_PREFIX, portalUser.getPortalUserRoles().iterator().next().getPortalRole());
claims.put("PortalUserRoles", portalUser.getPortalUserRoles().iterator().next());
claims.put("fullname", portalUser.getPerson().getFirstname() + " " + portalUser.getPerson().getFirstname());
claims.put("UserType", "portaluser");
claims.put("UserDetails", userDetails);
Date issuedAt = new Date();
Date expireAt = new Date(issuedAt.getTime() + jwtDuration);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(issuedAt)
.setExpiration(expireAt)
.signWith(SignatureAlgorithm.HS512, jwtSecret)
.compact();
}
Когда я перехожу к getAuthentication и хочу создать участника, я не могу создать его как свойство UserDetails. Это связано с тем, что Claims.get ("UserDetails") не распознается как свойство класса UserDetails.
UserDetails principal = claims.get("UserDetails");
Я получаю сообщение об ошибке: не удается преобразовать объект в UserDetails.
Я попытался преобразовать объект в userDetails, но при запуске выдает ошибку.
В своем контроллере я пытаюсь получить текущего пользователя, вошедшего в систему:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = principal.getUsername();
log.info("UD = " + username);
} else {
String username = principal.toString();
log.info("username = " + username);
}
//Return the list
return ResponseEntity.ok(country);
}
Проблема в том, что я не получаю принципала как instanceof UserDetails, поэтому я не могу вызвать Principal.getUsername (); (Это функция из класса UserDetails)
Если я попытаюсь заполнить UserDetails во время первоначального создания принципала, я получаю огромный запрос, который ВЫБИРАЮТ всю информацию о пользователе каждый раз, когда я вызываю API, и я не хочу, чтобы это происходило. Этот пример кода приведен ниже:
UserDetails principal = authService.getUserDetailsByUuid(getUuidFromToken(token));
Кто-нибудь сталкивался с этой проблемой раньше или знает решение?
Вы пробовали использовать настраиваемый десериализатор для утверждений? Например, вы можете попробовать использовать миксины Джексона - github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotatio ns