Alexandre Parabéns. Essa vídeo aula vai me acrescentar em muito os meus conhecimentos. Adorei a sua performance. Muito didático. São 02:00 da madrugada e estou aqui firme e forte te assistindo. Aula maravilhosa. Gratíssima pelos seus ensinamentos. Um Grande Abraço.
Uau, que vídeo perfeito! Era o guia de implementação de segurança com o Spring Security que eu estava precisando! Obrigado e parabéns a toda a equipe da AW, Deus abençoe sempre!
Aula sensacional. Estava procurando algo que explicasse isso com calma e com detalhes. Muitas das partes foram e sanam dúvidas essenciais. No final, sei que os códigos são grandes e fica difícil a explicação. Revendo dá pra entender. Algo que senti falta é que ao salvar os perfis no BD vc precisa colocar "ROLE_" + TIPO DO PERFIL. A pergunta é: existe alguma forma de não colocar dessa forma no BD?
Opa, como faço para por exemplo, colocar no browser 'localhost:8080/projetos' -> aparecer a tela de login, e após logar, redirecionar para a pagina de projetos, ou a que eu defini no url do browser (e não para a pagina home/default)
Só uma correção... nas constraint nao executam pois o tipo do campo da tabela grupo_permissao - campo permissao_id tem que ser bigint. O mesmo server para usuario_grupo grupo_id bigint
Aula muito boa!! Facilitou bastante na hora de entender o processo e o porquê de cada coisa!! Mas to com um probleminha aqui, criei minha pagina de login e tudo, mas quando autentico o usuario e senha ele só recarrega a pagina de login. Como eu resolvo?
A classe WebSecurityConfig citada está com anotação @Configuration no exemplo, mas não sei se faz diferença em adotar como anotação o @EnableWebSecurity que vejo ser mais citado nos tutorias presentes em sites :|
Olá, Alexandre. Parabéns pela palestra, cara. Já li também alguns artigos seus no blog da AlgaWorks e vejo que você manja muito e sabe como expressar todo esse conhecimento. Você poderia, por gentileza, nos indicar alguma referência que seja prática - além da documentação em si - sobre Spring MVC e Spring Framework em geral? Já li o e-book de vocês sobre Spring Boot e fiquei querendo saber mais. Pode ser em inglês também! Abraço!!
Alexandre, sabe me dizer como resolver o erro abaixo? Náo encontrei a solu;áo em nenhum lugar.. tomcat 4login:1 Refused to apply style from 'localhost:8080/login' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
Olá, parabéns pela palestra. Ficou muito bom. Só uma sugestão, a parte do UserDetailsService ficou meio confuso, você poderia ter usado o pattern Repository para facilitar. Mas no demais está de show de bola!
Estamos usando o Spring Security para controlar isso. E o Sprin Boot só facilita essa configuração. Veja que na classe UdsSecurityConfig, colocamos a anotação @Configuration, e nesta classe, criamos um método 'configureGlobal' que será responsável por definir as configurações de autenticação com o AuthenticationManagerBuilder e o PasswordEncoder passados por parâmetro. Normalmente isso é bem transparente. Só é preciso entender como funcionam estas configurações automáticas do Spring. #equipeAW
Otima aula, Alexandre pq no localhos funciona normal, mas quando jogo no centos7 e na hora de logar aparece isso: {"timestamp":1525419086939,"status":999,"error":"None","message":"No message available"}
Como sempre ótima didática parabéns, estou só com uma dúvida, perdoe se for bobagem. baixei o projeto e rodei sem mexer em nada e ele trouxe as informações do banco que banco é esse ? que ele utilizou ? debguei vi que o retorno foi esse [conn9: url=jdbc:h2:mem:testdb user=SA]] de onde está vindo essa informação
Adicione a dependency da h2. H2 é um banco de dado bom pra fase de test. link from maven mvnrepository.com/artifact/com.h2database/h2/1.4.196 Lembre-se que este db podes abri-lo apartir mesmo do browser. localhost:8080/h2-console. One hint just change that with mySql or something else. Hope I help.
Boa tarde Douglas, Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. #equipeAlgaWorks
Tentando estudar e ao mesmo tempo colocar na app que estou desenvolvendo, as páginas não são bloqueadas. Logo após o login e senha tem acesso a qualquer página: Se eu digitar /paciente/novo a página abre normalmente após usuário/senha. Fiz assim para teste: @Override protected void configure(HttpSecurity http) throws Exception { http. authorizeRequests() .antMatchers("/paciente/home").hasAnyRole("PG_HOME") .anyRequest() .authenticated() .and() .formLogin() .loginPage("/entrar") .permitAll(); } ==================================================================== @Configuration public class InMemorySecurityConfig { @Autowired public void configureGlobal(AuthenticationManagerBuilder builder) throws Exception { builder .inMemoryAuthentication() .withUser("abc").password("123").roles("PG_HOME"); } } ===================================================================
Olá Raphael, tudo bem? Você pode deixar a sua dúvida na Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava Criamos essa comunidade justamente para ajudar nossos seguidores e alunos. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar. Até mais e bons estudos! #equipeAlgaWorks
Boa tarde Francisco,Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar. #equipeAlgaWorks
Francisco eu dei uma pedalada aqui para fazer conectar ao banco ai está a configuração do application.properties, se for está pergunta qualquer coisa me fala se deu certo. spring.datasource.url=jdbc:mysql://localhost/seubanco?verifyServerCertificate=false&useSSL=false&requireSSL=false spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.username=root spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate settings are prefixed with spring.jpa.hibernate.* spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
Tem algum exemplo com múltiplas paginas de login? No meu site vou ter areas para perfis de usuários diferentes, dai a necessidade de multiplas paginas para login !
@Alexandre Afonso Prezado estou procurando justamente por isto mais em um outro cenário, ter a aplicação Web e dentro dela ter um Recurso REST , tudo em um mesmo sistema então preciso de um login pelo formulário e outro pelo HTTP para a API, estou com um enorme problema porque eu cheguei a criar varias instancias de WebSecurityConfigurerAdapter dentro do arquivo de configuração do Security uma justamente para a API contudo pelo postman eu recebo o html da pagina de login mesmo tendo configurado a uri começando com /api localhost:8090/api/produtos sera que tem algum material link para poder me ajudar nesta questão?
Baixei o codigo, ao terntar fazer login, verifiquei o post no navegador ele que está retornando um status 302. Se eu for nos parametros deste post, o username e password q estou digitando no form está sendo indicado sem nenhuma segurança. Como proteger isso?
Oi Caio, bom dia. Tudo bem? Sobre o 302 é um redirecionamento normal. Sobre ele estar desprotegido... Imagino que esteja olhando isso no developer do Chrome, não é mesmo? Porque não tem como você proteger isso. O que você pode fazer é utilizar o HTTPS para proteger a requisição que sai da máquina (entre sair da máquina e chegar no servidor).
Sou novo no spring gostaria da ajuda de vcs... ao subir minha aplicação e esse erro e gerado: Error creating bean with name 'viewResolver' defined in class path resource , se alguém puder me ajudar... gostaria de parabenizar a Algaworks pelas aulas e cursos!
Bom dia Wanderson, Somente com essas informações não dá para saber exatamente como você pode resolver seu problema. Vá, por favor, até nossa comunidade e programadores Java (em alga.works/comunidadejava) e deixe sua pergunta com mais detalhes por lá. Coloque o erro completo e a classe de configuração onde você está configurando o "viewResolver". #equipeAlgaWorks
Olá interessante! porém fiz o import do projeto, mas está aprestando o seguinte erro ao rodar " Erro: Não foi possível localizar nem carregar a classe principal com.algaworks.gp.Aplicacao"
Bom dia Alexandre! Parabéns pelo conteúdo! Preciso invalidar o usuário, caso ele digita a senha errada no máximo 4 ou 5 vezes, isso se ele estiver digitando o "username corretamente, claro". Sabe me dizer se o spring security tem algo pronto para isso?
Da forma como vou passar aqui pra você, primeiro vai precisar dessa dependência aqui: org.thymeleaf.extras thymeleaf-extras-springsecurity4 ... Depois vai poder usar, nas tags HTML, os atributos: sec:authorize="hasRole('UM_PAPEL_QUALQUER')" ... e: sec:authentication="name" Ou então, um pouco diferente dos exemplos acima, pode usar assim: th:text="${#authentication.principal.name}" Acredito que ainda tenham variações disso, mas assim é a forma que mais usamos. #equipeAW
Boa tarde, Não precisa configurar a classe WebSecurityConfig no web.xml, mas caso ainda fique com dúvidas você pode tirar elas em nossa comunidade de desenvolvedores Java. Vá até alga.works/comunidadejava e deixe os detalhes da sua pergunta por lá que tem várias pessoas disposta a ajudar (inclusive nossos instrutores passam por lá as vezes também). #equipeAlgaWorks
Esse "remember-me" não seria um ponto a ser explorado pra alguém pegar nome de usuário e senha pra fazer um acesso indevido? As informações do usuário ficam armazenadas de que forma? Criptografadas ou em plain-text?
Boa tarde Valmir, Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar. #equipeAlgaWorks
Boa tarde Raimundo, Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar. #equipeAlgaWorks
Assisti agora em 2024 e adorei o conteúdo!
Boa tarde Alexandre, o seu trabalho é muito bacana
Incrível, obrigado por compartilhar gratuitamente um conteúdo tão relevante
Muito obrigado mais uma vez Alexandre! Show de aula!!
Alexandre Parabéns. Essa vídeo aula vai me acrescentar em muito os meus conhecimentos. Adorei a sua performance. Muito didático. São 02:00 da madrugada e estou aqui firme e forte te assistindo. Aula maravilhosa. Gratíssima pelos seus ensinamentos. Um Grande Abraço.
Boa tarde Luzia,
Bacana!
Continue nos acompanhando em nossas redes sociais.
#equipeAlgaWorks
Uau, que vídeo perfeito! Era o guia de implementação de segurança com o Spring Security que eu estava precisando! Obrigado e parabéns a toda a equipe da AW, Deus abençoe sempre!
Até agora eu só vi 6 minutos e já tô achando perfeito
Excelente muito obrigado pela grande aula, Alexandre você é muito corajoso e ser um dos poucos a trocar conhecimento.
Boa tarde Jairo,
Bacana!
Continue nos acompanhando em nossas redes sociais.
#equipeAlgaWorks
Excelente palestra, ajudou muito a entender a proposta do spring security
Muito bom, muito didatico. Deu pra pegar tudinho que foi explicado em apenas uma passada..
Legal Pedro. Continue nos acompanhando. #EquipeAW
Conteúdo muito bom, didática incrível, vou utilizar em meus projetos, obrigado. Continuem assim.
Boa tarde Caio,
Continue nos acompanhando em nossas redes sociais.
#equipeAlgaWorks
Parabéns Alexandre. Grande didática. Muito bem explicado. Abs,
Oi Carlos, tudo bem? Valeu pelo feedback. Continue acompanhando nossas publicações para ter acesso a novos conteúdos. Abraço!
essa aula foi demais!!!
Parabéns Alexandre. Muito boa a aula.
Que aula!
Parabéns, Alexandre!
Ficou muito bacana o vídeo.
Top. Aprendi muito.
Muito bom, parabéns e obrigado pela partilha.
Boa tarde Fernanda,
Bacana!
Continue nos acompanhando em nossas redes sociais.
#equipeAlgaWorks
Aula sensacional. Estava procurando algo que explicasse isso com calma e com detalhes. Muitas das partes foram e sanam dúvidas essenciais. No final, sei que os códigos são grandes e fica difícil a explicação. Revendo dá pra entender. Algo que senti falta é que ao salvar os perfis no BD vc precisa colocar "ROLE_" + TIPO DO PERFIL. A pergunta é: existe alguma forma de não colocar dessa forma no BD?
Excepcional!
Parabéns!
Ajuda demais.
Que aula! Gratidão por compartilhar!!
baixei o projeto la mas na hora de importar e selecionar n consigo mas mesmo assim achei boa a aula
Opa, como faço para por exemplo, colocar no browser 'localhost:8080/projetos' -> aparecer a tela de login, e após logar, redirecionar para a pagina de projetos, ou a que eu defini no url do browser (e não para a pagina home/default)
Só uma correção... nas constraint nao executam pois o tipo do campo da tabela grupo_permissao - campo permissao_id tem que ser bigint. O mesmo server para usuario_grupo grupo_id bigint
gostei bastante, mas a gente consegue fazer o controle de autorização tb direto nos métodos dos controllers?
Queria que fizesse isso com as tabelas no banco de dados e também que fosse registrado os logins.
Bem didático! Parabéns!
Salvou a minha pele. PARABÈNS!!!!
Ótima palestra! Muito útil. ☕
Aula muito boa!! Facilitou bastante na hora de entender o processo e o porquê de cada coisa!!
Mas to com um probleminha aqui, criei minha pagina de login e tudo, mas quando autentico o usuario e senha ele só recarrega a pagina de login.
Como eu resolvo?
A classe WebSecurityConfig citada está com anotação @Configuration no exemplo, mas não sei se faz diferença em adotar como anotação o @EnableWebSecurity que vejo ser mais citado nos tutorias presentes em sites :|
Olá, Alexandre. Parabéns pela palestra, cara. Já li também alguns artigos seus no blog da AlgaWorks e vejo que você manja muito e sabe como expressar todo esse conhecimento. Você poderia, por gentileza, nos indicar alguma referência que seja prática - além da documentação em si - sobre Spring MVC e Spring Framework em geral? Já li o e-book de vocês sobre Spring Boot e fiquei querendo saber mais. Pode ser em inglês também! Abraço!!
Alexandre, sabe me dizer como resolver o erro abaixo? Náo encontrei a solu;áo em nenhum lugar..
tomcat 4login:1 Refused to apply style from 'localhost:8080/login' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
Olá, parabéns pela palestra. Ficou muito bom. Só uma sugestão, a parte do UserDetailsService ficou meio confuso, você poderia ter usado o pattern Repository para facilitar. Mas no demais está de show de bola!
Boa tarde Thiago,
Agradecemos a sugestão.
Continue nos acompanhando em nossas redes sociais.
#equipeAlgaWorks
Não entendi uma coisa. Porque na query USUARIO_POR_LOGIN só está comparando o login na clausula do where, e o password, compara na onde?
Estamos usando o Spring Security para controlar isso. E o Sprin Boot só facilita essa configuração.
Veja que na classe UdsSecurityConfig, colocamos a anotação @Configuration, e nesta classe, criamos um método 'configureGlobal' que será responsável por definir as configurações de autenticação com o AuthenticationManagerBuilder e o PasswordEncoder passados por parâmetro.
Normalmente isso é bem transparente. Só é preciso entender como funcionam estas configurações automáticas do Spring. #equipeAW
Otima aula, Alexandre pq no localhos funciona normal, mas quando jogo no centos7 e na hora de logar aparece isso: {"timestamp":1525419086939,"status":999,"error":"None","message":"No message available"}
QUE DELICIA DE AULAAAAAAAAAA
Como sempre ótima didática parabéns, estou só com uma dúvida, perdoe se for bobagem.
baixei o projeto e rodei sem mexer em nada e ele trouxe as informações do banco
que banco é esse ? que ele utilizou ?
debguei vi que o retorno foi esse [conn9: url=jdbc:h2:mem:testdb user=SA]]
de onde está vindo essa informação
Adicione a dependency da h2. H2 é um banco de dado bom pra fase de test. link from maven
mvnrepository.com/artifact/com.h2database/h2/1.4.196
Lembre-se que este db podes abri-lo apartir mesmo do browser. localhost:8080/h2-console.
One hint just change that with mySql or something else. Hope I help.
Como faço para alterar e colocar no meu mySql
Boa tarde Douglas,
Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente.
#equipeAlgaWorks
Tentando estudar e ao mesmo tempo colocar na app que estou desenvolvendo, as páginas não são bloqueadas. Logo após o login e senha tem acesso a qualquer página: Se eu digitar /paciente/novo a página abre normalmente após usuário/senha. Fiz assim para teste:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests()
.antMatchers("/paciente/home").hasAnyRole("PG_HOME")
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/entrar")
.permitAll();
}
====================================================================
@Configuration
public class InMemorySecurityConfig {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder builder) throws Exception {
builder
.inMemoryAuthentication()
.withUser("abc").password("123").roles("PG_HOME");
}
}
===================================================================
Olá Raphael, tudo bem? Você pode deixar a sua dúvida na Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava
Criamos essa comunidade justamente para ajudar nossos seguidores e alunos. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar.
Até mais e bons estudos!
#equipeAlgaWorks
Bom dia Alexandre. É possível usar spring security junto com angular?
Como interligar ao MySql essa pequena aplicação?
Boa tarde Francisco,Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar.
#equipeAlgaWorks
Francisco eu dei uma pedalada aqui para fazer conectar ao banco ai está a configuração do application.properties, se for está pergunta qualquer coisa me fala se deu certo.
spring.datasource.url=jdbc:mysql://localhost/seubanco?verifyServerCertificate=false&useSSL=false&requireSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate settings are prefixed with spring.jpa.hibernate.*
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
Bom dia,
Deu certo meu amigo. Grato.
Tem algum exemplo com múltiplas paginas de login? No meu site vou ter areas para perfis de usuários diferentes, dai a necessidade de multiplas paginas para login !
@Alexandre Afonso Prezado estou procurando justamente por isto mais em um outro cenário, ter a aplicação Web e dentro dela ter um Recurso REST , tudo em um mesmo sistema então preciso de um login pelo formulário e outro pelo HTTP para a API, estou com um enorme problema porque eu cheguei a criar varias instancias de WebSecurityConfigurerAdapter dentro do arquivo de configuração do Security uma justamente para a API contudo pelo postman eu recebo o html da pagina de login mesmo tendo configurado
a uri começando com /api localhost:8090/api/produtos sera que tem algum material link para poder me ajudar nesta questão?
Muito bom o conteúdo, mas faltou um item nessa lista. Como recuperar uma senha através de um link. Abraço.
Baixei o codigo, ao terntar fazer login, verifiquei o post no navegador ele que está retornando um status 302. Se eu for nos parametros deste post, o username e password q estou digitando no form está sendo indicado sem nenhuma segurança. Como proteger isso?
Oi Caio, bom dia. Tudo bem?
Sobre o 302 é um redirecionamento normal.
Sobre ele estar desprotegido... Imagino que esteja olhando isso no developer do Chrome, não é mesmo? Porque não tem como você proteger isso. O que você pode fazer é utilizar o HTTPS para proteger a requisição que sai da máquina (entre sair da máquina e chegar no servidor).
Sou novo no spring gostaria da ajuda de vcs... ao subir minha aplicação e esse erro e gerado: Error creating bean with name 'viewResolver' defined in class path resource , se alguém puder me ajudar... gostaria de parabenizar a Algaworks pelas aulas e cursos!
Bom dia Wanderson,
Somente com essas informações não dá para saber exatamente como você pode resolver seu problema. Vá, por favor, até nossa comunidade e programadores Java (em alga.works/comunidadejava) e deixe sua pergunta com mais detalhes por lá. Coloque o erro completo e a classe de configuração onde você está configurando o "viewResolver".
#equipeAlgaWorks
Olá interessante! porém fiz o import do projeto, mas está aprestando o seguinte erro ao rodar " Erro: Não foi possível localizar nem carregar a classe principal com.algaworks.gp.Aplicacao"
Tente remover o método main da classe SecurityConfig e rodar novamente. #equipeAW
Bom dia Alexandre! Parabéns pelo conteúdo!
Preciso invalidar o usuário, caso ele digita a senha errada no máximo 4 ou 5 vezes, isso se ele estiver digitando o "username corretamente, claro". Sabe me dizer se o spring security tem algo pronto para isso?
Estou com uma dúvida, de como exibir o nome do usuário logado, utilizando o Thymeleaf, se puder me explicar, eu agradeço.
Da forma como vou passar aqui pra você, primeiro vai precisar dessa dependência aqui:
org.thymeleaf.extras
thymeleaf-extras-springsecurity4
... Depois vai poder usar, nas tags HTML, os atributos:
sec:authorize="hasRole('UM_PAPEL_QUALQUER')"
... e:
sec:authentication="name"
Ou então, um pouco diferente dos exemplos acima, pode usar assim:
th:text="${#authentication.principal.name}"
Acredito que ainda tenham variações disso, mas assim é a forma que mais usamos. #equipeAW
Olá, primeiramente parabéns pela aula, muito boa! Tenho uma dúvida, como eu configuro no arquivo Web.xml a classe de configuração WebSecurityConfig?
Boa tarde,
Não precisa configurar a classe WebSecurityConfig no web.xml, mas caso ainda fique com dúvidas você pode tirar elas em nossa comunidade de desenvolvedores Java. Vá até alga.works/comunidadejava e deixe os detalhes da sua pergunta por lá que tem várias pessoas disposta a ajudar (inclusive nossos instrutores passam por lá as vezes também).
#equipeAlgaWorks
algaworks Obrigado!
Esse "remember-me" não seria um ponto a ser explorado pra alguém pegar nome de usuário e senha pra fazer um acesso indevido? As informações do usuário ficam armazenadas de que forma? Criptografadas ou em plain-text?
Boa tarde Valmir,
Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar.
#equipeAlgaWorks
Grande Alexandre! você sem alguma dica sobre intregração do spring com o Active Diretory?
Podemos ter acesso ao codigo fonte ?
Boa tarde Raimundo,
Criamos a Comunidade Java da AlgaWorks, através desse link: alga.works/comunidadejava , justamente para ajudar quem está sem suporte ou ainda não adquiriu nenhum curso com a gente. Por lá tanto os alunos e membros da comunidade quanto os instrutores dos cursos poderão te ajudar.
#equipeAlgaWorks
Não querendo ser chato. Não existe "a nível de" diga "ao nível de"