Spring Boot - Jwts.builder не удается разрешить метод 'signWith ()' - PullRequest
0 голосов
/ 14 июля 2020

Я следил за этой весенней загрузкой + angular учебником на YouTube , который использует Spring Security и JSON веб-токены (JWT) для аутентификации пользователя. Однако я дошел до момента в видео, где у меня есть ошибка в моем классе jwtUtil2. По какой-то причине всякий раз, когда я пытаюсь запустить свое весеннее приложение, я получаю эту ошибку:

Error:(41, 17) java: no suitable method found for signWith(java.security.PrivateKey)
    method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,byte[]) is not applicable
      (actual and formal argument lists differ in length)
    method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,java.lang.String) is not applicable
      (actual and formal argument lists differ in length)
    method io.jsonwebtoken.JwtBuilder.signWith(io.jsonwebtoken.SignatureAlgorithm,java.security.Key) is not applicable
      (actual and formal argument lists differ in length)

Также, если я смотрю на класс jwtUtil2, у него есть красная линия под параметром, который предоставляется Jwts.builder ( ) .signWith () в строке 41. Если я наведу курсор на ошибку, появится сообщение: Невозможно разрешить метод 'signWith (java .security.PrivateKey)'.

@Service
public class JwtUtilTwo
{
    private KeyStore keyStore;

    @PostConstruct
    public void init() {
        try
        {
            keyStore = KeyStore.getInstance("JKS");
            InputStream resourceAsStream = getClass().getResourceAsStream("/springblog.jks");
            keyStore.load(resourceAsStream, "secret".toCharArray());
        }
        catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e)
        {
            throw new SpringRubbishRewardsException("Exception occurred while loading keystore");
        }
    }

    public String generateToken(Authentication authentication) {
        User principal = (User) authentication.getPrincipal();
        return Jwts.builder()
                .setSubject(principal.getUsername())
                .signWith(getPrivateKey()) //ERROR HERE
                .compact();
    }

    private PrivateKey getPrivateKey()
    {
        try
        {
            return (PrivateKey) keyStore.getKey("springblog", "secret".toCharArray());
        }
        catch (KeyStoreException | NoSuchAlgorithmException | UnrecoverableKeyException e)
        {
            throw new SpringRubbishRewardsException("Exception occurred while retrieving public key from keystore");
        }
    }
}

Теперь я действительно нашел способ исправить ошибку, изменив зависимости Maven в файле pom. Я просмотрел репозиторий GitHub учебника YouTube для видео и скопировал следующие зависимости JWT и закомментировал свою исходную зависимость JWT:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>rubbish-rewards</groupId>
    <artifactId>rubbish-rewards-api</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!--<dependency> MY ORIGINAL JWT DEPENDENCY
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>-->

        <!--NEW JWT DEPENDENCIES FROM THE TUTORIALS GITHUB REPOSITORY -->

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.10.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <scope>runtime</scope>
            <version>0.10.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <scope>runtime</scope>
            <version>0.10.5</version>
        </dependency>

       <!--==================================================-->

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>

    </dependencies>
</project>

Хотя это устраняет первую проблему, появляется новая проблема, когда я пытаюсь запустить мое приложение. На этот раз у него есть ошибка, которая гласит:

2020-07-14 11:52:35.833  WARN 14616 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authenticateController': Unsatisfied dependency expressed through field 'authenticateService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authenticateService': Unsatisfied dependency expressed through field 'jwtUtil2'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jwtUtilTwo': Invocation of init method failed; nested exception is rubbishrewards.exceptions.SpringRubbishRewardsException: Exception occurred while loading keystore

Я бы отправил код в свои классы authenticationController и AuthenticationService, но мне кажется, что это сделает этот вопрос слишком загроможденным. Так что вместо вот ссылка на мой репозиторий GitHub приложений .

Вот ссылка на учебник YouTube (с отметкой времени) и ссылка на сопровождающие видео Репозиторий GitHub .

Я новичок в Spring, поэтому понятия не имею, что происходит. Если бы кто-нибудь мог помочь, я был бы признателен.

1 Ответ

0 голосов
/ 25 июля 2020

У меня была та же проблема, что и у вас, и я также пришел к тому же решению, используя зависимость jwt 2018 года, но внимательно присмотревшись к репозиторию свободного кода GitHub, обратите внимание, что файл springblog.jks имеет вес 2,54, поэтому я загрузил его и открыл его с помощью vim, и в нем было много странных символов, я скопировал его в свои ресурсы папки, и все заработало. Вам просто нужно добавить этот файл в свой проект, и он будет работать с текущими зависимостями jwt.

...