gpt4 book ai didi

java - 如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:33 25 4
gpt4 key购买 nike

我用 spring boot 开发了一个应用程序,运行良好。有一个 Restful Controller 。我试图向某些页面添加 spring 安全性。其余 Controller 的端点是

/api/greetings

我在下面的类中配置了安全设置。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home","/api/greetings").permitAll()
//.antMatchers("/api/greetings","").permitAll()//can't do this
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}

现在,当我尝试从 Rest 客户端(Postman)访问 Rest 端点时,只能访问 GET 方法,如果我尝试 POST、PUT 或 DELETE,我将收到 403 Forbidden 响应。

{
"timestamp": 1467223888525,
"status": 403,
"error": "Forbidden",
"message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.",
"path": "/api/greetings/2"
}

我该如何解决这个问题。我是 Spring Security 的新手。

最佳答案

更新答案

如果您使用的是 Spring security 4,则可以轻松禁用特定路由

http.csrf().ignoringAntMatchers("/nocsrf","/ignore/startswith/**")

如果没有,您可以使用 requireCsrfProtectionMatcher

在特定路由上启用/禁用 CSRF
http.csrf().requireCsrfProtectionMatcher(new RequestMatcher() {
private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
private RegexRequestMatcher apiMatcher = new RegexRequestMatcher("/v[0-9]*/.*", null);

@Override
public boolean matches(HttpServletRequest request) {
// No CSRF due to allowedMethod
if(allowedMethods.matcher(request.getMethod()).matches())
return false;

// No CSRF due to api call
if(apiMatcher.matches(request))
return false;

// CSRF for everything else that is not an API call or an allowedMethod
return true;
}
});

原始答案

您遇到错误是因为 CSRF 处理在 Spring Security 中默认处于“开启”状态。

您可以通过添加 http.csrf().disable(); 来禁用它。

但真的,您会让您的应用程序处于不安全状态吗?我邀请你阅读this article保护您的应用程序免受 CSRF,即使您的应用程序是基于 REST 服务而不是表单提交。

关于java - 如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38108357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com