10
respostas

Erro ao testar no docker

quando testo no docker ele me manda diretamente para o link http://localhost:8080/login e não dexa logar com os usuarios que criamos no caso aluno@email.com com senha 123456 e mesmo assim ele da erro, no terminal ele marca que esta sendo linkado para um usuario com id nulo segue log do erro:

2021-07-07 12:07:41.662 ERROR 1 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
        at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:250) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:198) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:90) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:166) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:219) ~[spring-security-core-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:95) ~[spring-security-web-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
        at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.3.3.RELEASE.jar!/:5.3.3.RELEASE]
10 respostas

Oi Joao,

Posta aqui sua classe SecurityConfigurations e tambem o comando que voce rodou para executar o docker.

eu usei o seguinte comando no docker :

docker run -p 8080:8080 -e FORUM_DATABASE_URL='jdbc:h2:mem:alura-forum' -e FORUM_DATABASE_USERNAME='sa' -e FORUM_DATABASE_PASSWORD='' -e FORUM_JWT_SECRET='123456' alura/forum

codigo da SecurityConfigurations:

@EnableWebSecurity
@Configuration
@Profile(value = {"prod", "test"})
public class SecurityConfigurations extends WebSecurityConfigurerAdapter {

    @Autowired
    private AutenticacaoService autenticacaoService;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private UsuarioRepository usuarioRepository;

    @Override
    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }

    //Configuracoes de autenticacao
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(autenticacaoService).passwordEncoder(new BCryptPasswordEncoder());
    }

    //Configuracoes de autorizacao
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers(HttpMethod.GET, "/topicos").permitAll()
        .antMatchers(HttpMethod.GET, "/topicos/*").permitAll()
        .antMatchers(HttpMethod.POST, "/auth").permitAll()
        .antMatchers(HttpMethod.GET, "/actuator/**").permitAll()
        .antMatchers(HttpMethod.DELETE, "/topicos/*").hasRole("MODERADOR")
        .anyRequest().authenticated()
        .and().csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, usuarioRepository), UsernamePasswordAuthenticationFilter.class);
    }


    //Configuracoes de recursos estaticos(js, css, imagens, etc.)
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**.html", "/v2/api-docs", "/webjars/**", "/configuration/**", "/swagger-resources/**");
    }

quando testo o programa no proprio eclipse ele da a mesma resposta

Oi Joao,

Acho que o problema é por conta da classe SecurityConfigurations estar com @Profile(value = {"prod", "test"}) e quando voce roda o projeto nao esta informando o profile ativo e com isso essa classe nao é carregada pelo Spring.

Quando rodar no terminal precisa de mais um parametro:

-e SPRING_PROFILES_ACTIVE='prod'

Fiz o teste mas deu o mesmo erro:

# docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE='prod' -e FORUM_DATABASE_URL='jdbc:h2:mem:alura-forum' -e FORUM_DATABASE_USERNAME='sa' -e FORUM_DATABASE_PASSWORD='' -e FORUM_JWT_SECRET='123456' alura/forum

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.1.RELEASE)

2021-07-08 12:28:54.345  INFO 1 --- [           main] br.com.alura.forum.ForumApplication      : Starting ForumApplication v0.0.1-SNAPSHOT on 3adef925236b with PID 1 (/app/app.jar started by root in /app)
2021-07-08 12:28:54.350  INFO 1 --- [           main] br.com.alura.forum.ForumApplication      : The following profiles are active: 'prod'
2021-07-08 12:28:56.813  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
2021-07-08 12:28:56.955  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 127ms. Found 3 JPA repository interfaces.

Pelo log agora ele carregou o profile correto:

The following profiles are active: 'prod'

E no log que voce mandou nao apareceu nenhum erro. Voce mandou aqui o log completo?

Desculpa nem tinha pensado nisso segue codigo completo do console https://gist.github.com/JoaoCGualb/810458200ad78b537cff40f9ebf21cce

Oi Joao,

Deve ser por conta de uma atualizacao do Spring Security.

Altera esse metodo na sua classe SecurityConfigurations:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(autenticacaoService).passwordEncoder(passwordEncoder());
}

E crie um novo metodo:

@Bean
public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
}

fiz as alterações, deletei a imagem anterior e criei tanto um novo jar quanto uma nova imagem mas o erro continua, é normal ela aparecer mesmo essa tela de login com o endereço /login mesmo nos utilizando no projeto o endereço /auth pra validar o usuario?

Oi Joao,

Estranho mesmo, era pra ja estar ok.

Consegue compartilhar seu projeto, via github ou google drive?

segue link do git hub https://github.com/JoaoCGualb/forum-alura

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software