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!

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