我已经设置了一个授权和资源服务器,它们都在同一个应用程序中运行。使用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();
}
}
答案 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