Проверка подлинности Java Springboot getAuthentication создать участника

Я создаю токен 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

ZhenyaM 30.03.2021 13:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
20
0

Другие вопросы по теме