我有2个类扩展了WebSecurityConfigurerAdapter
。并且不能让他们一起工作。
这个想法如下:
WebSecurityConfigurerAdapter
,仅将自定义过滤器添加到安全链。过滤器执行一些自定义身份验证,并将Authentication
保存到SecurityContext
中。这通常可以正常工作。配置如下(省略导入): @Order(1)
@Configuration
@EnableWebMvcSecurity
public class BestSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private BestPreAuthenticationFilter ssoAuthenticationFilter;
@Bean
protected FilterRegistrationBean getSSOAuthenticationFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(ssoAuthenticationFilter);
// Avoid include to the default chain
filterRegistrationBean.setEnabled(false);
return filterRegistrationBean;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterAfter(ssoAuthenticationFilter, SecurityContextPersistenceFilter.class);
}
@Configuration
protected static class AuthenticationConfiguration extends
GlobalAuthenticationConfigurerAdapter {
@Autowired
private BestAuthenticationProvider authenticationProvider;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
}
}
@ComponentScan
包含并获得自定义身份验证排序的库类。显然,他们希望提供自定义的HttpSecurity
以保护编辑点。尝试类似: @Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/testUrl").hasRole("NON_EXISTING")
.anyRequest().authenticated();
}
}
显然,由于我的用户不是
NON_EXISTING
角色的成员,因此不应访问测试URL。不幸的是她。如果将安全性
authorizeRequests()
部分移至配置类形式1。在添加安全性过滤器旁边,则它将按预期阻止访问。但是在我看来,第二种配置似乎被忽略了。我还调试了
configure()
方法,并注意到HttpSecurity
不是同一个对象,它散发出一点气味。任何提示如何使我的工作倍受赞赏。
总结目标:
WebSecurityConfigurerAdapter
,它添加了过滤器,并被库Spring Boot 1.1.6-发布
最佳答案
定义一个特殊的接口(interface)
public interface ServiceWebSecurityConfigurer {
void configure(HttpSecurity http) throws Exception;
}
然后只有一个ConfigurerAdapter:
public class MyConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired(required = false)
ServiceWebSecurityConfigurer serviceSecConfig;
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(). // whatever
if (serviceSecConfig != null) serviceSecConfig.configure(http);
http.authorizeRequests(). // whatever
}
}
然后在需要时在其他地方实现ServiceWebSecurityConfigurer。也可以有多种实现,只需将它们自动连接为列表,然后迭代并在您的主要配置中使用它们即可。