Realizando o curso "Adicionando Segurança a uma API REST com Spring Security"
https://web.dio.me/course/adicionando-seguranca-a-uma-api-rest-com-spring-security
percebi que há uma falha em seu arquivo github, projeto "dio-spring-security-jwt", url:
https://github.com/digitalinnovationone/dio-springboot/tree/main/dio-spring-security-jwt
do professor Gleysson Sampaio:
Ao tentar acessar a rota http://localhost:8080/users com a entrada {"name":"GLEYSON SAMPAIO", "username":"glysns","password":"jwt2023", "roles": ["USERS","MANAGERS"]} por exemplo, o mesmo retorna o status 403: forbidden e o erro de console: io.jsonwebtoken.MalformedJwtException: JWT strings must contain exactly 2 period characters. Found: 0, quando na verdade o mesmo está autorizado no método configure da classe anotada como @Configure, método:
@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("Configure");
http.headers().frameOptions().disable();
http.cors().and().csrf().disable()
.addFilterAfter(new JWTFilter(), UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.antMatchers(SWAGGER_WHITELIST).permitAll()
.antMatchers("/h2-console/**").permitAll()
.antMatchers(HttpMethod.POST,"/login").permitAll()
.antMatchers(HttpMethod.POST, "/users").permitAll() // Aqui a permissão
.antMatchers(HttpMethod.GET,"/users").hasAnyRole("USERS","MANAGERS")
.antMatchers("/managers").hasAnyRole("MANAGERS")
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
Creio que por se tratar no controller da classe que fará o cadastramento, não deveria ser bloqueado pelo Eclipse o acesso à mesma.
Não consigo cadastrar um usuário para acessar o Token.
Pesquisando, esta tudo correto mesmo, mas em algum lugar o código esta inconsistente, e não é neste trecho .
pedi um exemplo do simples do gpt.
Talvez ajude.
/users deve permitir acesso sem autentificação, pois ele é o cadastro de usuários: Um exemplo de JSON para ele é: {"name":"GLEYSON SAMPAIO", "username":"glysns","password":"jwt2023", "roles": ["USERS","MANAGERS"]}
Se username e a senha esta definido no codigo para o acesso, então você tem que enviar para o /login as credenciais, se ocorrer o match então ele vai no filter e providencia a você um token, então na proxima requisição para o /users você envia o token, para ter acesso. creio que é assim, alguém me corrige se eu estiver errado.