2
respostas

Autenticacao dando problema

Ola.

Estava implementando uma solucao com num projeto pessoal e fui utilizar a parte de autenticacao e configuracao de seguranca desse curso. Implementei tudo igual e me saia esse erro :

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

Para confirmar descarreguei o projeto completo (compila e esta rodando) da alura e continua saindo o mesmo erro.

No Postman ele nao dispara o erro e fica no status 401 unautorazed criei a requesicao POST: http://localhost:8080/auth Parametros:

{
    "email": "aluno@email.com",
    "senha": "123456"
}

O erro dispara no console do eclipse se tento logar pelo navegador.

Aqui esta o codigo da classe SecurityConfigurations :

@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);
    }

Nao sei o que pode passei o dia todo tentando buscar uma solucao e nada.

2 respostas

Oi Gabriel,

Acho que você deve estar utilizando o Spring 5 no seu projeto.

Na versão 5 é necessário que o hash da senha tenha um prefixo identificando qual o encoder dele.

Por exemplo, até a versão 4 esse seria uma hash de senha com o encoder BCrypt:

$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS

Mas na versão 5 do Spring esse hash precisa ser assim:

{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS

Então acho que os registros no seu banco de dados estejam sem esse prefixo e isso está causando o erro ao tentar realizar a autentição.

Ola Rodrigo.

Obrigado pela resposta e sim, parece que era esse o problema que ao baixar o projeto ele nao vem com a versao definida e estava utilizando a versao 5 e funcionou perfeitamente agora.

Todos os roles e etc funcionando perfeitamente.

Agora tenho um problema com o Postman que nao quer authenticar, parece que nao acontece nada. (No console do eclipse nao aparece nada quando clico para enviar a resquisicao POST: http://localhost:8080/auth)

E tambem nao consigo acessar o H2 depois de autenticar pelo navegador, eu entro na pagina http://localhost:8080/h2-console clico em conectar e me joga nessa pagina:

Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jun 04 16:41:01 CEST 2021 There was an unexpected error (type=Forbidden, status=403). Forbidden

Tentei adicionar a permicao aqui mas tambem nao funcionou:

//Authorization configurations
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers(HttpMethod.GET, "/super-heroes").permitAll()
        .antMatchers(HttpMethod.GET, "/super-heroes/*").permitAll()
        .antMatchers(HttpMethod.POST, "/auth").permitAll()
        .antMatchers(HttpMethod.GET, "/actuator/**").permitAll()
        .antMatchers(HttpMethod.DELETE, "/super-heroes/*").hasRole("MODERATOR")
        .antMatchers("/h2-console/").permitAll()
        .antMatchers("/h2-console/*").permitAll()
        .anyRequest().authenticated()
        .and().csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().addFilterBefore(new AuthenticationByTokenFilter(tokenService, userRepository), UsernamePasswordAuthenticationFilter.class);
    }

Igualmente obrigado pela ajuda com o bccrypt.