spring-data-jpa Curl允许我GET,但不允许我POST ... Spring JPA

apeeds0o  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(131)

当我运行Spring应用程序,然后尝试与REST API通信时,它允许我GET,但不允许POST。
这是可行的:

curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b http://localhost:5000/activity/getall

这不起作用:

curl -u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b
-H "Accept: application/json" 
-X POST 
-d '{
    "name":"Sleep",
    "criteria":"Sleep at least 8 hrs",
    "ini":"2022-08-30",
    "periodicity":"DAY",
    "periodicityCount":"1"
    }'
http://localhost:5000/activity/post

如果您注意到用户名和密码相同。
我得到的回答是:

HTTP/1.1 403 
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: Mon, 29 Aug 2022 19:25:27 GMT
Connection: close

{
  "timestamp": "2022-08-29T19:25:27.510+00:00",
  "status": 403,
  "error": "Forbidden",
  "path": "/activity/post"
}
bis0qfac

bis0qfac1#

API调用失败的原因是您在Spring Security配置中启用了CSRF保护。
其工作方式是,对于每个非GET请求(= POST、PUT、PATCH或DELETE),您需要包含一个CSRF令牌。
要获取CSRF令牌,首先需要触发GET请求(例如http://localhost:5000/activity/getall)。在响应标头中,您应该看到包含XSRF-TOKEN cookie的Set-Cookie标头。例如:

Set-Cookie: XSRF-TOKEN=098b732a-282a-11ed-a261-0242ac120002

现在,您需要复制XSRF-TOKEN cookie的值(应该包含UUID),并将其设置为X-XSRF-TOKEN头的值:

curl \
-u user:a75fd7ea-9a6e-4943-bc0c-3b0a96bda51b
-H "Accept: application/json"
-H "X-XSRF-TOKEN: 098b732a-282a-11ed-a261-0242ac120002"
-X POST \
-d '{
    "name":"Sleep",
    "criteria":"Sleep at least 8 hrs",
    "ini":"2022-08-30",
    "periodicity":"DAY",
    "periodicityCount":"1"
    }'
http://localhost:5000/activity/post

在此之后,您的请求应该会成功。请注意,此POST请求的响应将包含一个新的CSRF令牌,您必须将其复制到下一个请求中。
或者,您可以通过在Spring Security配置中设置.csrf().disable()来禁用CSRF保护。

相关问题