2016-02-29 75 views
3

我已经为我的springframework RESTful服务配置了Springframework安全性(4.0)。对于浏览器启动的GET访问以及html表单,其中action = GET但对于其中method = requestMethod.POST的服务失败,无论是从浏览器提交带有action = POST的HTML表单;或从远程应用程序使用RestTemplate。Springframework安全性,无法提交POST方法的HTML表单

要查看问题,我将配置简化为以下内容。有了这个,我可以访问Method = GET的所有服务,而不会受到证书的挑战(看起来是正确的),但是接收到“accessDeniedPage”的失败(我从来没有受到过证书的挑战)

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

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

如果我用下面的配置,我将访问方法的服务时的挑战凭据= get时仍然会看到访问方法= 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"); 
} 

我做错了什么?

回答

0

我发现我的表单提交失败的原因。

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

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

希望这会有所帮助。

1

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

如果添加以下Spring表单标签库包含在您的网页上:

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

使用温泉<form:form>标签在JSP,而不是一个标准的HTML <form>它会从(强烈推荐)CSRF令牌会自动添加到您的形成。

这样做会更安全,并且是一种很好的做法,而不是禁用该功能。

另外,如果你想使用一个标准的HTML <form>您可以添加以下隐藏字段和Spring Security将处理其余部分:

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

感谢您的信息。可否请您填写关于如何为标准HTML添加隐藏字段的句子?由于HTML页面是从Restful服务的服务器返回的,因此我希望看看能否让自己远离JSP。 – user1693207

+0

@ user1693207我已经添加了隐藏的字段示例。 – dkanejs