Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro 403Forbidden - Depois de implementar tudo o erro continua...

Fiz todos os passos do vídeo até aqui, mas a requisição de login, mas continua disparando o erro 403. Se alguém puder ajudar, agradeço desde já!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

log do console no intellij apos disparar a requisição:

2023-08-02T13:05:18.369-03:00  INFO 10192 --- [nio-9000-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-08-02T13:05:18.369-03:00  INFO 10192 --- [nio-9000-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-08-02T13:05:18.372-03:00  INFO 10192 --- [nio-9000-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
package med.voll.api.controller;

import jakarta.validation.Valid;
import med.voll.api.domain.usuario.DadosAutenticacao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/login")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager manager;

    @PostMapping
    public ResponseEntity efetuarLogin(@RequestBody @Valid DadosAutenticacao dados) {

        var token = new UsernamePasswordAuthenticationToken(dados.login(), dados.senha());
        var authentication = manager.authenticate(token);

        return ResponseEntity.ok().build();
        
    }
    
}
package med.voll.api.infra.security;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;


@Configuration
@EnableWebSecurity
public class SecurityConfigurations {




    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .build();
    }


    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}
//código omitido

import java.util.Collection;
import java.util.List;

@Table(name = "usuarios")
@Entity(name = "Usuario")
@Getter // A partir dessa anotação todas são lombok
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Usuario implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String login;
    private String senha;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority("ROLE_USER"));
    }


    @Override
    public String getPassword() {
        return senha;
    }

    @Override
    public String getUsername() {
        return login;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
5 respostas

Olá, Luis!

Por padrão, o Spring Security protege todos os seus endpoints. Então, ao adicionar essa dependência, automaticamente todos os recursos da sua API passam a exigir autenticação. Para liberar um endpoint, você precisa alterar sua classe de configuração do Spring Security.

No método securityFilterChain, faça as seguintes alterações:

 @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
            .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            // Alterações necessárias
            .authorizeHttpRequests()
            .requestMatchers(HttpMethod.POST, "/login").permitAll()
            .and()
            .build();
    }

Olá Arthur, tudo bem!?

Esse código que você passou deu deprecated no .authorizeHttpRequests() e .and(), o código compilou, mas depois de feita a requisição continuou disparando o erro 403.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

log do console no intellij apos disparar a requisição:

2023-08-02T13:50:30.970-03:00  INFO 1904 --- [nio-9000-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-08-02T13:50:30.970-03:00  INFO 1904 --- [nio-9000-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-08-02T13:50:30.974-03:00  INFO 1904 --- [nio-9000-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms

Opa, Luis!

Segue o trecho de código atualizado:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers(HttpMethod.POST, "/login").permitAll()
                .anyRequest().authenticated())
            .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .build();
    }
solução!

Fala Arthur!

Obrigado pela disposição e boa vontade em me ajudar!

O trecho atualizado que me enviou compilou sem deprecated, mas continuou o erro 403, inclusive em todas as requisições do CRUD.

Vasculhei mais uma vez em todo o fórum e achei essa solução que o instrutor Rodrigo Ferreira postou. Depois deu tudo certo.

O SecurityFilterChain assim:

//Processo de Autenticação Stateless
    @Bean // Exportar para que seja possível injetar em outra classe
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .headers(headers -> headers.frameOptions(frame -> frame.sameOrigin()))
                .csrf(csrf -> csrf.disable())
                .build();
    }

E a inclusão de mais essa configuração na classe SecurityConfigurations:

@Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().requestMatchers(new AntPathRequestMatcher("/login"));
    }

Eu estava com o mesmo problema e isso funcionou pra mim. Salvou :)