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

.permitAll nao esta funcionando

Ola a todos Estou tendo um problema com o meu projeto, eu estou trabalhando em um projeto proprio, seguindo as aulas, agora na implementacao da camada de seguranca ao definir o meu endpoint que preciso que seja acessado sem autorizacao nao esta deixando eu acessar, por mais que eu coloque ele para ficar liberado nao me permite acessar sem antes logar, segue meu codigo:

package com.example.controlefamiliabackend.config.validacao.security;

import com.example.controlefamiliabackend.repositories.UsuarioRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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.WebSecurityCustomizer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfigurations {

    private final UsuarioRepository usuarioRepository;
    private final AutenticacaoService autenticacaoService;

    @Autowired
    public SecurityConfigurations(UsuarioRepository usuarioRepository, AutenticacaoService autenticacaoService) {
        this.usuarioRepository = usuarioRepository;
        this.autenticacaoService = autenticacaoService;
    }

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

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

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http.authorizeRequests()
                .antMatchers(HttpMethod.POST, "/usuario").permitAll()
                .anyRequest().authenticated().and().formLogin();

        return http.build();
    }

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/**.html", "/v2/api-docs", "/webjars/**", "/configuration/**", "/swagger-resources/**");
    }
}
6 respostas

Oi Marcos,

A princípio está certinho.

Como você está disparando a requisição?

Estou disparando assim:

http://localhost:8080/usuario

Esse seria meu endpoint com a parte do POST que e a que preciso que esteja liberada para cadastros novos:

@RestController
@RequestMapping(path = "/usuario")
public class UsuarioController {

    private final UsuarioRepository usuarioRepository;

    public UsuarioController(UsuarioRepository usuarioRepository) {
        this.usuarioRepository = usuarioRepository;
    }

    @PostMapping
    @Transactional
    public ResponseEntity<UsuarioDto> saveUsuario(@RequestBody @Valid UsuarioForm usuarioForm,
                                                  UriComponentsBuilder uriComponentsBuilder){
        UsuarioModel usuarioModel = usuarioForm.converter();
        URI uri = uriComponentsBuilder.path("/usuario/{id}").buildAndExpand(usuarioModel.getId()).toUri();
        usuarioRepository.save(usuarioModel);
        return ResponseEntity.created(uri).body(new UsuarioDto(usuarioModel));
    }

Pois é, está tudo certinho :D

Pode compartilhar seu projeto?

Eu consegui arrumar, mas não sei se pode considerar uma boa pratica, eu coloequei no SecurityConfigurations na function filterChain

.csrf().disable()

Em todo o caso estou passando o link do meu projeto no gitHub

https://github.com/MarcosRossoni/controle-familia-backend

obgr

solução!

Ah sim!

Por padrão a proteção contra Cross-site Request Forgery é habilitada e em todas as requisições POST o Spring exige o token csrf.

Em APIs Rest que utilizam autenticação via tokens essa proteção pode ser desabilitada, pois o token JWT tem o mesmo efeito de proteção.

Otimo, entao posso deixar a implementacao como esta, prentendo ainda criar o endpoint para esqueci minha senha, agora fico mais tranquilo em questao de acesso sem autenticacao para algumas partes, obgr.