gpt4 book ai didi

java - AccessDecisionManager,如何添加RoleVoter

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:16 25 4
gpt4 key购买 nike

首先我想问一下,是否可以在 Java 配置中访问默认的 AccessDecisionManager(不使用任何 xml 文件)?

次要的,我的问题看起来像那样。我想将 RoleVoter 添加到我的配置中,但我不知道该怎么做。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

...

@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ADMIN > USER");
return roleHierarchy;
}

@Bean
public RoleHierarchyVoter roleHierarchyVoter(RoleHierarchy roleHierarchy){
return new RoleHierarchyVoter(roleHierarchy);
}

我的尝试是通过 authorizeRequests().accessDecisionManager(defaultAccessDecisionManager) 将我的 AffirmativeBased 管理器 bean 添加到 HttpSecurity

@Bean
public AffirmativeBased defaultAccessDecisionManager(RoleVoter roleVoter, AuthenticatedVoter authenticatedVoter, PreInvocationAuthorizationAdviceVoter preAdviceVoter){
AffirmativeBased affirmativeBased = new AffirmativeBased(Arrays.asList(new WebExpressionVoter,(AccessDecisionVoter) roleVoter));
affirmativeBased.setAllowIfAllAbstainDecisions(true);
return affirmativeBased;
}

但是由于 WebExpressionConfigAttribute 类总是在 getAttribute 方法上返回 null,所以在投票时失败了。

编辑:我想我明白了。我的尝试并没有错,这里是 defaultAccessDecisionManager

的小编辑
@Bean
public AffirmativeBased defaultAccessDecisionManager(RoleHierarchy roleHierarchy){
WebExpressionVoter webExpressionVoter = new WebExpressionVoter();
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy);
webExpressionVoter.setExpressionHandler(expressionHandler);
return new AffirmativeBased(Arrays.asList((AccessDecisionVoter) webExpressionVoter));
}

但是,我仍然必须将此 defaultAccessDecisionManager 添加到配置中的每个 HttpSecurity 对象。有人知道如何在全局范围内做到这一点吗?

最佳答案

http
.requestMatchers().antMatchers("/**")
.authorizeRequests()
.antMatchers("/auth/**").permitAll()
.antMatchers("/admin/only").hasRole("ADMIN")
.anyRequest().authenticated()
.withObjectPostProcessor(new ObjectPostProcessor<AffirmativeBased>() {
@Override
public AffirmativeBased postProcess(AffirmativeBased affirmativeBased) {
affirmativeBased.getDecisionVoters().add(0, myAccessDecisionVoter1()); // add before WebExpressionVoter
affirmativeBased.getDecisionVoters().add(myAccessDecisionVoter2()); // add after WebExpressionVoter
return affirmativeBased;
}
});

关于java - AccessDecisionManager,如何添加RoleVoter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22696401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com