Ошибка при доступе к JPA внутри Spring Boot Security Authentication

Я реализую API REST с Spring Boot, следуя некоторым руководствам в Интернете, все в порядке, пока мне не нужно использовать токен обновления для восстановления токена аутентификации после истечения срока его действия. Итак, в моем Spring Boot Security я добавил экземпляр RefreshToken с идентификатором пользователя.

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
                                        Authentication auth) throws IOException, ServletException {

    String token = Jwts.builder().setIssuedAt(new Date()).setIssuer(ISSUER_INFO)
            .setSubject(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername())
            .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS512, SUPER_SECRET_KEY).compact();

    String refreshTokenString = UUID.randomUUID().toString();
    RefreshToken refreshToken = new RefreshToken(refreshTokenString, Long.parseLong(StringUtils.substringAfter(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername(), Constants.STRING_SEPARATOR4)));
    refreshTokenRepository.save(refreshToken);   <-------------------------------------- ERROR HERE!!!!

    response.addHeader(HEADER_AUTHORIZACION_KEY, TOKEN_BEARER_PREFIX + " " + token);

    response.addHeader("refreshToken", refreshTokenString);

    response.addHeader("emailHash",
            StringUtils.substringBetween(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername(), Constants.STRING_SEPARATOR1, Constants.STRING_SEPARATOR2)
    );
    response.addHeader("instanceId",
            StringUtils.substringBetween(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername(), Constants.STRING_SEPARATOR2, Constants.STRING_SEPARATOR3)
    );
    response.addHeader("enabled",
            StringUtils.substringBetween(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername(), Constants.STRING_SEPARATOR3, Constants.STRING_SEPARATOR4)
    );
}

Ошибка, которую я всегда получаю, находится в строке .save() репозитория.

2020-11-19T17:19:09.613116+00:00 app[web.1]: 2020-11-19 17:19:09.612 ERROR 4 --- [io-56866-exec-4] o.s.b.w.servlet.support.ErrorPageFilter  : Forwarding to error page from request [/login] due to exception [null]
2020-11-19T17:19:09.613127+00:00 app[web.1]:
2020-11-19T17:19:09.613127+00:00 app[web.1]: java.lang.NullPointerException: null

Раньше я пытался получить полный пользовательский экземпляр из JPA и получил ту же ошибку при выполнении findByEmail, которую я использую во всем приложении без каких-либо проблем, поэтому я думаю, что это связано с постоянством, но я потерялся без этого .save( ), все остальное работает нормально, за исключением того, что токен обновления не сохраняется :(


person Quimi Font    schedule 19.11.2020    source источник
comment
Мне кажется, что проблема с инъекцией Bean. Как вы создаете здесь репозиторий? А также, как вы создаете экземпляр самого SecurityConfig? Если вы используете Autowiring, обязательно используйте его последовательно.   -  person k-wasilewski    schedule 19.11.2020
comment
Вау, это правда... решено! Я отправляю ответ ... спасибо!   -  person Quimi Font    schedule 20.11.2020


Ответы (1)


Решение найдено! Проблема была в экземпляре репозитория, я сделал это в фильтре с помощью:

@Autowired
private RefreshTokenRepository refreshTokenRepository;

Я не понимаю почему, но я так не работаю, поэтому я переместил экземпляр в класс Security Configuration и передал репозиторий var в качестве параметра фильтру, тогда это сработало! Спасибо k-wasilewski.

Если кто-нибудь знает, почему экземпляр с @Autowired в фильтре не работает, было бы неплохо узнать.

person Quimi Font    schedule 20.11.2020