Java Springframework安全性,无法为POST方法提交html表单

Java Springframework安全性,无法为POST方法提交html表单,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我已经为我的Springframework RESTful服务配置了Springframework安全性(4.0)。对于浏览器启动的GET访问和html表单(其中action=GET),一切都进行得很顺利,但对于method=requestMethod.POST的服务,一切都失败了,要么通过浏览器提交一个带有action=POST的html表单;或者从远程应用程序使用RestTemplate 为了查看问题,我将配置简化为以下内容。这样,我就可以访问Method=GET的所有服务,而不会被质询凭据

我已经为我的Springframework RESTful服务配置了Springframework安全性(4.0)。对于浏览器启动的GET访问和html表单(其中action=GET),一切都进行得很顺利,但对于method=requestMethod.POST的服务,一切都失败了,要么通过浏览器提交一个带有action=POST的html表单;或者从远程应用程序使用RestTemplate

为了查看问题,我将配置简化为以下内容。这样,我就可以访问Method=GET的所有服务,而不会被质询凭据(似乎是正确的),但会收到“accessDeniedPage”的失败消息(我从未被质询凭据)

所有服务都在“/CouponController/**”下:

如果我使用以下配置,当访问method=GET的服务时,我将被质询凭据,而当访问method=POST的服务时,我仍然会看到相同的行为:

@Override
protected void configure (HttpSecurity http) throws Exception { 
  http.authorizeRequests()
    .antMatchers("/CouponController/**").access("hasRole('STAFF')")
    .and().formLogin().permitAll()
   .and().exceptionHandling().accessDeniedPage("/Accesses_Denied_Due_To_Security_failure");
}

我做错了什么?

我找到了表单提交失败的原因

默认情况下,spring安全性为XML和Java配置启用csrf。这导致我的代码无法提交表单,因为我提交的表单不包含csrf令牌。不幸的是,当我使用Java配置时,错误消息只有“404请求的资源不可用”。当我切换到XML配置时,错误消息将提供信息

禁用csrf后,表单提交成功。现在,我需要返回,并找出如何在我的表单中包含csrf令牌


希望这有帮助。

它失败的原因是表单中没有CSRF令牌

如果添加页面上包含的以下Spring表单标记库:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

在JSP中使用Springs
标记,而不是标准的HTML
,它会自动将(强烈推荐的)CSRF标记添加到表单中

这将更加安全,是一种良好的做法,而不是禁用该功能

或者,如果您想使用标准HTML
,您可以添加以下隐藏字段,Spring Security将处理其余字段:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />


谢谢您提供的信息。请您完成关于如何为标准HTML添加隐藏字段的句子好吗?因为HTML页面是从Restful服务从服务器返回的,所以我想看看是否可以让自己远离JSP。@user1693207我添加了隐藏字段示例。
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />