我尝试使用Java Config设置Spring Security 3.2项目,而根本没有XML。 我想要一个支持RoleHierarchyVoter和AclEntryVoters的Access决策选民。这是我使用的配置:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AclEntryVoter aclUpdatePropertyVoter;
@Autowired
private AclEntryVoter aclDeletePropertyVoter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.and()
.logout()
.deleteCookies("JSESSIONID")
.logoutSuccessUrl("/")
.and()
.authorizeRequests()
.accessDecisionManager(accessDecisionManager())
.antMatchers("/login", "/signup/email", "/logout", "/search", "/").permitAll()
.anyRequest().authenticated();
}
@Bean
public RoleHierarchyVoter roleVoter() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_USER > ROLE_ANONYMOUS");
RoleHierarchyVoter roleHierarchyVoter = new RoleHierarchyVoter(roleHierarchy);
return roleHierarchyVoter;
}
@Bean
public AffirmativeBased accessDecisionManager() {
List<AccessDecisionVoter> decisionVoters = new ArrayList<>();
WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
decisionVoters.add(webExpressionVoter);
decisionVoters.add(roleVoter());
decisionVoters.add(aclDeletePropertyVoter);
decisionVoters.add(aclUpdatePropertyVoter);
AffirmativeBased affirmativeBased = new AffirmativeBased(decisionVoters);
return affirmativeBased;
}
}
然而,当应用程序初始化时,我得到以下异常:
我得到例外:
java.lang.IllegalArgumentException: AccessDecisionManager does not support secure object class: class org.springframework.security.web.FilterInvocation
调试代码时,我可以看到调用AbstractAccessDecisionManager并执行以下代码时:
public boolean supports(Class<?> clazz) {
for (AccessDecisionVoter voter : this.decisionVoters) {
if (!voter.supports(clazz)) {
return false;
}
}
return true;
}
RoleHierarchyVoter支持FilterInvocation,但是AclEntryVoters无法传递它。我在配置中做错了什么?如何设置项目以便它支持两种类型的选民?非常感谢提前
答案 0 :(得分:1)
正如您所观察到的,acl选民不支持过滤器调用,因为它们用于检查安全方法,而不是Web请求。
您应该配置一个单独的AccessDecisionManager
以用于您的方法安全性,并将acl选民添加到其中。