我正在尝试使用单个Auth服务器从多个客户端访问多个资源服务器。
我正在尝试从同一个auth服务器访问两个资源服务器,我的资源服务器配置如下所示。
@Bean
@Scope("prototype")
protected ResourceServerConfiguration resource1() {
ResourceServerConfiguration resource = new ResourceServerConfiguration();
resource.setConfigurers(Arrays.<ResourceServerConfigurer> asList(new ResourceServerConfigurerAdapter() {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId(RESOURCE_ID1).tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.requestMatchers().antMatchers("/greeting")
.and()
.authorizeRequests()
.antMatchers("/users").hasRole("ADMIN");
}
}
resource.setOrder(4);
return resource;
}
@Bean
@Scope("prototype")
protected ResourceServerConfiguration resource2() {
ResourceServerConfiguration resource = new ResourceServerConfiguration();
resource.setConfigurers(Arrays.<ResourceServerConfigurer> asList(new ResourceServerConfigurerAdapter() {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId(RESOURCE_ID2).tokenStore(tokenStore);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.requestMatchers().antMatchers("/welcome")
.and()
.authorizeRequests()
.antMatchers("/users").hasRole("ADMIN");
}
}
resource.setOrder(5);
return resource;
}
由于WebSecurityConfigurerAdapter的默认顺序为3,我已将资源订单服务器分别配置为4和5。
但配置的Beans正在被覆盖,我可以访问具有订单5的资源“/ welcome”,如果我尝试访问资源“/ greeting”,我收到以下错误,
{ "timestamp": 1444400211270, "status": 403, "error": "Forbidden", "message": "Expected CSRF token not found. Has your session expired?", "path": "/greeting"}
如果我在资源之间交换顺序,我可以访问具有最高值5的资源。
注意:我有两个客户端,因此可以访问RESOURCE1,另一个可以访问RESOURCE2。
请告知我遗失的事情。
答案 0 :(得分:1)
来自ResourceServerConfigurer
的Javadoc:
应用程序可能会提供此接口的多个实例 general(与其他安全配置程序一样),如果不止一个 配置相同的属性,然后最后一个获胜。配置器 在应用之前按
Order
排序。
因此,可以在permitAll()
路径中添加/welcome
。