Spring Security 为什么Sping Boot 在POST时返回403?

4zcjmb1e  于 12个月前  发布在  Spring
关注(0)|答案(2)|浏览(197)

好吧,我有点困惑,调试我已经恢复到这个.

.authorizeHttpRequests((authz) -> authz.anyRequest().permitAll())

字符串
我有以下几点

@RestController
@RequestMapping("contact")
public class LeadController {
    @Autowired
    private PotentialContactRepo potentialContactRepo;

    @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void addContact(@RequestBody PotentialContact contact) {
        potentialContactRepo.save(contact);
    }

    @GetMapping
    public ResponseEntity<String> getContact() {
        return ResponseEntity.ok("Hello");
    }
}


但是当我用postman调用post端点时,我得到一个403,但是当我调用get时,我得到一个200。

POST /contact HTTP/1.1
User-Agent: PostmanRuntime/7.31.0
Accept: */*
Cache-Control: no-cache
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 151
 
name=...&contactInfo=...&location=Wherever&description=This%20is%20the%20description%3B!%40%23%24%23%24%40%24%40%23%24%40%23
 
HTTP/1.1 403 Forbidden
Set-Cookie: Path=/; HttpOnly
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
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: Mon, 27 Nov 2023 05:10:11 GMT
Keep-Alive: timeout=60
Connection: keep-alive


我错过了什么?

dxxyhpgq

dxxyhpgq1#

看起来像Spring Security配置,可能是POST请求的403 Forbidden响应的原因。您共享的authorizeHttpRequests方法正在授予所有请求permitAll(),所以它不应该导致问题。所以我认为Spring Security可能需要POST请求的CSRF令牌,和Postman中的可能不会发送它。现在尝试禁用CSRF,看看它是否解决了这个问题。您可以通过修改您的安全配置.csrf().disable()来做到这一点。添加到您的authorizeHttpRequests链::

.authorizeHttpRequests((authz) -> authz
    .anyRequest().permitAll()
)
.csrf().disable();

字符串
旁注:在生产环境中禁用CSRF并不是一个好主意,但它有助于您进行调试
另外,请检查您是否将@EnableWebSecurity annotation添加到您的configuration class中。此annotation启用Spring Security的Web安全支持。例如:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {}


希望这能帮助你

gtlvzcf8

gtlvzcf82#

在我的例子中,帮助我的真实的答案来自@dur,我补充道

logging:
  level:
    org.springframework: TRACE

字符串
没有掉进兔子洞,这让我终于看到...

Content-Type 'application/x-www-form-urlencoded;charset=UTF-8' is not supported


这让我想到了this answer
在我的例子中,道德是不要在表单编码中使用@RequestBody

相关问题