Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

[Bug] Erro na geração de token

Conforme comentario https://cursos.alura.com.br/forum/topico-bug-injection-of-autowired-dependencies-failed-401658, no final, estou com dificuldades para criar usuários para fazer login. Utilizo banco H2 para testar estes tipos de cenários. Se eu colocar um usuário existente no banco, retorna o erro abaixo Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSe eu testar com um usuário que não existe no banco, retorna o erro 500: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Outro erro encontrado, quando eu passo o login e o password, depois de criados, retorna erro abaixo: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

11 respostas

Oi!

O segundo erro tem relação com o Swagger. Manda aqui o seu pom.xml do projeto

Segue o pom.xml:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.0-M2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.plano.saude</groupId>
    <artifactId>cadastro</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cadastro</name>
    <description>Microserviço voltado para plano de saúde</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.1.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

</project>

Pode ser incompatibilidade com a versão do Spring Boot que você está usando.

Sugiro alterar a versão do Spring boot para a versão 3.2.2, pois você está utilizando uma versão que ainda está em Milestone e pode ter bugs. Confere também nas configs de segurança se está liberando os 3 endpoints do Swagger:

.requestMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()

Não resolveu. Mesmo erro:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
<!--		<version>3.3.0-M2</version>--> <!-- Versão Anterior do Spring Boot -->
        <version>3.2.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Fiz o debug do código quando analisei novamente e encontrei esse erro na hora de gerar o token: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeNa hora de passar os dados, para passar as credenciais, acho que não estou conseguindo passar da forma correta, a Collection está vindo nula e cai nesse método, validando como falso: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como que eu faço para validar o token, depois que eu criar corretamente no Banco de Dados, passando somente o login e o password cadastrados?

Oi Alexandre,

Você implementou o UserDetailsService? Pela lógica que tá seguindo e o erro que está estourando, parece que pode ser um problema nesse serviço, pois por baixo dos panos é ele que vai recuperar o User, se ele não for implementado vai gerar uma chamada recursiva de retentativas de recuperar o User do banco de dados, até que a pilha estoura e é lançada essa exception.

Me refiro a uma implementação parecida com essa aqui, dá um confere se tá tudo certinho:

@Service
public class AuthorizationService implements UserDetailsService {

    @Autowired
    UserRepository repository;
    
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return repository.findByLogin(username);
    }
}

Oi Mateus,

Essa classe foi criada e foi implementada dessa forma:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class AutenticacaoService implements UserDetailsService {

    @Autowired
    private UsuarioRepository usuarioRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return usuarioRepository.findByLogin(username);
    }
}

Antes estava funcionando, gerava os tokens corretamente, igual ao que foi explicado no curso. Depois que eu ajustei a classe LoginController, colocando os métodos POST, começaram a dar erros, tanto para gerar token, como para criar usuário. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alexandre, você consegue compartilhar o seu projeto?

O problema é que no seu projeto você colocou duas classes para implementar a interface UserDetailsService do Spring Security:

  • UsuarioService
  • AutenticacaoService

Apague a classe AutenticacaoService, pois a lógica já está feita na classe UsuarioService

solução!

Para a geração de token, testei, foi resolvido.