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

.permitAll não esta funcionando

Olá, estou com o mesmo problema do colega Marcos Rossoni. Mesmo usando .csrf().disable() não resolveu. Não libera o acesso para métodos POST.

   /*
     * Configurações de autorização
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(HttpMethod.POST, "/auth").permitAll()
            .anyRequest().authenticated()
            .and().csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

url

http://localhost:8081/auth

ResponseBody

{
    "timestamp": "2022-08-19T13:39:45.592+0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Access Denied",
    "path": "/auth"
}

Controller

package br.com.security.controller;

import javax.validation.Valid;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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;

import br.com.security.form.LoginForm;

@RestController
@RequestMapping("/auth")
public class AuthenticationController {

    @PostMapping
    public ResponseEntity<?> authentication(@RequestBody @Valid LoginForm loginForm) {

        return ResponseEntity.status(HttpStatus.OK).body(loginForm);
    }
}
10 respostas
 @Override
 protected void configure(HttpSecurity http) throws Exception {
        http.cors()
        .and()
        .csrf().disable()
        .authorizeRequests().antMatchers(HttpMethod.POST, "/auth").permitAll()
        .anyRequest().authenticated()
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
 }

caso nao resolva, tira o http method deixa apenas o ("/auth"). LEMBRANDO, que a ordem das coisas no método configure() importa ta.

No controller pode deixar a url no metodo mesmo.

@RestController
public class AuthenticationController {

    @PostMapping("/auth")
    public ResponseEntity<?> authentication(@RequestBody @Valid LoginForm loginForm) {

        return ResponseEntity.status(HttpStatus.OK).body(loginForm);
    }
}

outra coisa confirme se realmente voce esta mandando a requisicao via POST

Opa, fiz tudo conforme sugestão mas ainda assim não esta rolando. Estou mandando a requisição via POST mesmo.

Eu já tentei inverter a ordem de todo jeito e nada resolveu.

mostre como voce esta enviando a requisicao e mostre a saida do console quando voce inicia do projeto pode ser depois que voce faz a requisicao

Console

POST http://localhost:8081/auth
403
22 ms
Network
addresses: {…}
local: {…}
address: "::1"
family: "IPv6"
port: 56266
remote: {…}
address: "::1"
family: "IPv6"
port: 8081
Request Headers
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Cache-Control: no-cache
Postman-Token: 83f92b24-05f7-47e2-8179-c6d9dfb33e52
Host: localhost:8081
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 54
Cookie: JSESSIONID=D7ECDF167AA8EEAC84A2E90C9EB0316A
Request Body
{
    "userId": "m313966",
    "password": "1234"
}
Response Headers
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 19 Aug 2022 15:10:49 GMT
Keep-Alive: timeout=60
Connection: keep-alive
Response Body
{"timestamp":"2022-08-19T15:10:49.946+0000","status":403,"error":"Forbidden","message":"Access Denied","path":"/auth"}

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

Oi Alexandre,

Posta aqui o código completo da sua classe SecurityConfigurations.

Descobri o problema!

No meu caso eu tinha declarado no arquivo application.properties um context-path (que eu estava ocultando nas imagens e códigos acima para preservar identidade).

Estava algo parecido com isso:

server.servlet.context-path=documento

Eu estava tentando liberar context-parh + url:

.antMatchers("/documento/auth").permitAll()

Mas vi que funciona somente com a url:

.antMatchers("/auth").permitAll()

Dessa forma esta funcionando corretamente conforme o esperado. Esse seria um comportamento esperado?

Ah sim.

O context path é só para definir o endereço padrão de acesso, então as urls nas configurações de segurança tem que ignorá-lo, pois ele já é implicito.

Bons estudos!

Sim. ele vai bloquear. se voce quiser usar o context path teria que liberar assim ("**/auth")

solução!

Obrigado pela ajuda pessoal, abraço!