1
resposta

Configuração do Spring Security barra autenticação retornando Status 401

Olá Prof. @Rodrigo Ferreira e demais colegas que se esbarraram com esse tipo de problema. No projeto disponibilizado em https://github.com/alura-cursos/1843-spring-parte3-testes-deploy/archive/aula_5.zip inicialmente tive 2 tipos de problemas, primeiro era a questão do BCrypt onde pesquisando no próprio fórum acabei vendo que é necessário identificar as senhas com a concatenação da String "{bcrypt}", e que precisaria criar um bean para instanciar o passwordEncoder, onde foi resolvida a exceção " (There is no PasswordEncoder mapped for the id "null")". E até aí tudo bem. Consegui efetuar o login direto pela página. Mas ao tentar efetuar a autenticação pelo endpoint "/auth" passando as credenciais conforme pode ser visto no print do Postman abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeE fica nisso, mesmo com a configuração do HttpSecurity na classe do SecurityConfigurations, conforme pode ser visto abaixo:

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

Para melhor entendimento de quem estiver disponível em ajudar a entender esse problema eu criei um repositório público na minha conta do github e disponibilizei em https://github.com/jhonieldor/j-forum-alura, cujo qual, conforme mencionado no início deste POST, foi obtido do código fonte disponbilizado no final do curso. Mas até que tenha alguma resposta seguirei pesquisando a causa deste problema.

1 resposta

Cometi alguns enganos na postagem anterior, primeiro, que a classe SecurityConfigurations estava somente ativa para os profiles "test" e "prod", e a classe DevSecurityConfigurations apontava para o profile "dev" sendo que ao rodar o projeto no Intellij o profile ativo era identificado como "default" e isso que causou a confusão do status 401 nos meus testes. Outro equívoco meu foi a questão da concatenação da string "{brcrypt}", onde ao acrescentar ela no arquivo data.sql era retornando um erro de decodificação ao tentar efetuar autenticação pelo endpoint "/auth" onde dizia que a senha não parecia ser encodada pela instância da classe BCryptPasswordEncoder. Mas ainda assim foi necessário o bean para criação do passwordEncoder. Alterando o nome do profile setado para DevSecurityConfigurations de "dev" para "default" consegui fazer funcionar normalmente em ambiente de desenvolvimento cujo profile identificado pelo Spring como "default". Acontece que essa separação de profiles como o próprio professor falou no curso, serve para poder efetuar os testes sobre os endpoints rodando em ambiente de desenvolvimento sem ter que ficar executando o processo de autenticação, mas mantendo os mecanismos de segurança em ambiente de produção e testes automatizados, cujo foram definidos nos profiles "prod" e "test".