1
resposta

Não estava criando o User no banco...

Acompanhando a aula e copiando o código de acordo com o que o professor demonstrava, me deparei que o método "configure()" não estava integrando com o banco e nem criando um usuário para mim, então busquei por outras soluções já que a forma que é demonstrada na aula foi DESCONTINUADA pelo Spring, portanto, após descobrir aqui nos tópicos como adaptar o arquivo de configuração do Spring Security, também descobri como criar usuários no banco via arquivo de configuração, segue o código:

package br.com.alura.mvc.mudi;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.provisioning.JdbcUserDetailsManager; import org.springframework.security.provisioning.UserDetailsManager; import org.springframework.security.web.SecurityFilterChain;

@Configuration @EnableWebSecurity public class SecurityConfiguration {

@Autowired
private DataSource datasource;

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated())
            .formLogin(form -> form.loginPage("/login").permitAll()).logout(logout -> logout.logoutUrl("/logout"));

    return http.build();
}

@Bean
public UserDetailsManager users() {
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    UserDetails user = User.builder().username("[NOME_USUARIO]").password(encoder.encode("[SENHA]")).roles("ADM").build();

    JdbcUserDetailsManager users = new JdbcUserDetailsManager(datasource);
    users.createUser(user);
    return users;
}

}

O problema é que como DEVTOOLS do Spring reinicia e roda o arquivo de configuração todas vez, dá erro de usuário duplicado porque tenta criar o usuário novamente, como o professor comentou, portanto eu comentei as linhas que instaciam o UserDetails e cria no banco, assim que o primeiro foi criado, porém se eu quiser outro usuário é só descomentar e, antes de salvar o arquivo, alterar os nomes de usuário e senha.

O método users() , porém, precisa estar declarado para ele recuperar os usuários do banco e autenticá-los.

1 resposta

Olá Kurt, tudo bem?

Fico feliz que tenha encontrado uma solução para o seu problema! Realmente, a forma de criar usuários no banco via arquivo de configuração é uma boa alternativa para o método "configure()" que foi descontinuado pelo Spring.

Obrigado por compartilhar o código que você utilizou, com certeza será útil para outras pessoas que estiverem enfrentando o mesmo problema.

Sobre o erro de usuário duplicado, é importante ficar atento a isso mesmo. Comentar as linhas que criam o usuário no banco é uma boa solução para evitar esse problema.

Espero ter ajudado e bons estudos!