Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!