2

我有 2 个控制器:

一种)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.GET)
@Transactional
public String form(final Message message, final Model model) {
    return "portal/form";
}

b)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.POST)
@Transactional
@PreAuthorize("#message.id!=null ? hasPermission(#message, 'WRITE') : hasRole('ROLE_ADMIN')") 
public String form(@Valid final Message message, final Model model) {
    if (message.getId() == null) {
        someService.save(message);
        AclManager.create(message);
    } else {
        someService.update(message);
        AclManager.update(message);
    }
    return "redirect:result.html";
}

在我在控制器“b”中添加安全注释之前,一切都很好。现在,当我转到控制器“a”的页面并填写表格时,单击导致控制器“b”的按钮,我得到“HTTP 状态 405 - 不支持请求方法 'POST'”。为什么会发生这种情况以及如何解决?

UPD:我帮助添加到登录控制器 RequestMethod.POST

4

2 回答 2

3

没有你的 spring 安全配置很难调试,但我猜当你去 /portal/form.html 时,spring 会使用 HTTP POST 将你重定向到登录页面,而你的登录页面控制器处理程序只映射到 HTTP GET。尝试将登录页面处理程序映射到 POST 方法。

于 2013-07-05T02:49:48.783 回答
2

3.2.0.RELEASE在将我的应用程序对 Spring Security 的使用从基于 XML 的配置迁移到基于JavaConfig的配置时,我也碰巧遇到了您描述的症状。

在我的特定情况下,消息原因HTTP Status 405 - Request method 'POST' not supported是 Spring Security在使用基于JavaConfig的配置时默认激活 CSRF 保护。

要消除这一原因,可以:

  • 要么更新应用程序以遵循 Spring Security 的 CSRF 保护机制
  • 或者停用 Spring Security 的 CSRF 保护机制。

要停用 CSRF 保护机制,WebSecurityConfigurer请执行以下操作:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable() //FIXME
            .authorizeRequests() ....
    }

    // ...
}
于 2014-02-21T02:19:54.610 回答