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

Posted

技术标签:

【中文标题】如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法【英文标题】:How to enable POST, PUT AND DELETE methods in spring security 【发布时间】:2016-11-01 16:17:09 【问题描述】:

我使用 spring boot 开发了一个应用程序,它运行良好。有一个安静的控制器。我试图为某些页面添加弹簧安全性。 其余控制器的端点是

/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 客户端(邮递员)访问 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 方面的新手。

【问题讨论】:

因为我的是一个非浏览器应用程序,禁用 csrf 不会有什么坏处,它对我有用。我很好奇,如果我不想禁用 csrf 怎么办,或者如果我的应用程序也是 Web 应用程序,我找到了这个链接。虽然没有尝试过,但很快就会尝试。 ***.com/questions/27182701/… 【参考方案1】:

更新答案

如果您使用的是 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 服务而不是表单提交。

【讨论】:

有没有其他方法,不禁用csrf? 当我使用 http.csrf().disable();它还禁用了所有身份验证。 如果你想使用 CSRF 保护,那么你必须在你的 HTTP POST 请求中添加一个令牌。例如,您可以通过将“隐藏”类型的 html 输入元素添加到 html 表单来执行此操作。您可以从 CsrfTokenRepository 获取令牌。见docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/…

以上是关于如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中在 Spring Security 级别启用 CORS [关闭]

如何启用 Spring Security kotlin DSL?

如何解决在使用 Spring Boot 和 Spring Security 启用 CSRF 后无法正常工作的登录问题?

如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?

如何使用 Spring MVC 和 Spring Security 为资源处理程序启用 HTTP 缓存

Spring Security - 我如何启用方法安全注释?