405:更新到Spring Boot 1.3.0后不允许的方法

时间:2015-11-28 18:59:52

标签: spring spring-security spring-boot spring-security-oauth2

我已经设置了一个授权和资源服务器,它们都在同一个应用程序中运行。使用spring boot 1.2.6.RELEASE和spring security oauth2 2.0.7.RELEASE正常运行。更新到spring boot 1.3.0.RELEASE(无论是spring security oauth2 2.0.7.RELEASE还是2.0.8.RELEASE) / login 端点 POST 请求被打破了。我得到了响应405" Method Not Allowed"。

我花了一天没有成功。我还设置了一个额外的,直接的授权和资源服务器,它们都在同一个应用程序中运行。然而,这种轻量级设置具有相同的问题。一旦启用资源服务器,登录端点就不再有效。

配置片段下面是我的原始服务器。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    // ... some code

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .csrf()
                .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/oauth/authorize"))
                .disable()
                .logout()
                .logoutUrl(logoutUrl)
                .logoutSuccessHandler(logoutSuccessHandler)
                .invalidateHttpSession(true)
                .and()
                .formLogin()
                .permitAll()
                .loginProcessingUrl(loginProcessingUrl)
                .failureUrl(loginAuthenticationFailureUrl)
                .loginPage(loginPage);
    }

}

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    // ... some code

    private static final String RESOURCE_SERVER_MAPPING_REGEX = "^(?!(\\/?login|\\/?logout|\\/?oauth)).*$";

    // ...some code

    @Override
    public void configure(HttpSecurity http) throws Exception {

        http
            // Configure the endpoints wherefore the resource server is responsible or rather should bound to.
            .requestMatchers().regexMatchers(RESOURCE_SERVER_MAPPING_REGEX)
            .and()
            .authorizeRequests().anyRequest().permitAll()
            .and()
            .headers().frameOptions().disable();
    }
}

2 个答案:

答案 0 :(得分:2)

<强>解决方案

看起来我遇到了@EnableResourceServer creates a FilterChain that matches possible unwanted endpoints with Spring Security 4.0.3中提到的问题Spring Security是spring-boot-starter-security的依赖。由于spring-boot-starter-parent的更新,我从Spring Security 3.2.8切换到4.0.3。关于这个问题的另一个有趣的评论可以找到here

我更改了ResourceServer配置,就像下面解决问题的代码片段一样。

通过使用现有代码的否定来匹配登录和注销表单或者像Spring NotOAuthRequestMatcher这样的匹配器来替换RegexRequestMatcher定义会很棒,这是当前ResourceServerConfiguration的私有内部类。请不要犹豫发布建议。 ; - )

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    // ... some code

    private static final String RESOURCE_SERVER_MAPPING_REGEX = "^(?!(\\/?login|\\/?logout|\\/?oauth)).*$";

    // ...some code

    @Override
    public void configure(HttpSecurity http) throws Exception {

        http.requestMatcher(
                new AndRequestMatcher(
                        new RegexRequestMatcher(RESOURCE_SERVER_MAPPING_REGEX, null)
                )
        ).authorizeRequests().anyRequest().permitAll()
        // ...some code
    }

}

答案 1 :(得分:0)

这应该非常简单。

如果启用了CSRF,则不允许POST和PUT请求,并且弹出启动默认启用这些请求。

只需将其添加到您的ResourceServerConfig配置代码中:

.csrf().disable()

这也是一个示例问题here