Java 如何将投票者添加到默认的AccessDecisionManager?

Java 如何将投票者添加到默认的AccessDecisionManager?,java,spring,spring-security,Java,Spring,Spring Security,我想在spring应用程序的授权过程中添加一些业务逻辑,我认为实现自定义AccessDecisionVoter是最好的解决方案 那太好了,但是我还没有找到任何方法在不完全重新定义AccessDecisionManager bean的情况下将这个新投票者添加到授权过程中。这非常不方便,因为我的业务逻辑应该透明地添加,并且不需要任何特定的决策管理器。相反,它应该只告诉他的意见(投票),并让附带的应用程序应用它自己的授权策略 甚至SpringSecurity建议的示例()也使用这种方法 我在上还发现了

我想在spring应用程序的授权过程中添加一些业务逻辑,我认为实现自定义AccessDecisionVoter是最好的解决方案

那太好了,但是我还没有找到任何方法在不完全重新定义AccessDecisionManager bean的情况下将这个新投票者添加到授权过程中。这非常不方便,因为我的业务逻辑应该透明地添加,并且不需要任何特定的决策管理器。相反,它应该只告诉他的意见(投票),并让附带的应用程序应用它自己的授权策略

甚至SpringSecurity建议的示例()也使用这种方法

我在上还发现了一个有前途的解决方案,它可能会使用bean后处理器向任何AbstractAccessDecisionManager添加额外的投票者,但方法SetDecisionVorters(此类解决方案的关键)已被弃用,因此不成问题


因此,我想知道是否有某种方法可以将我的投票者添加到当前的AccessDecisionManager,而不必处理它。有什么想法吗?

一个irmativeBean扩展了AbstractAccessDecisionManager。只需使用getDecisionVorters()并将其添加到列表中

AfirmativeBean  afirmativeBean = (AfirmativeBean)bean);
afirmativeBean.getDecisionVoters().add(yourvoter);
@组件
公共类访问决策管理器{
@自动连线受保护的MethodInterceptor methodSecurityInterceptor;
@施工后
公共void init(){
if(methodSecurityInterceptor的methodSecurityInterceptor实例){
AccessDecisionManager AccessDecisionManager=((MethodSecurityInterceptor)MethodSecurityInterceptor).getAccessDecisionManager();
if(accessDecisionManager实例of AbstractAccessDecisionManager){
列表
@Component
public class AccessDecisionManagerCustomizer {

    @Autowired protected MethodInterceptor methodSecurityInterceptor;

    @PostConstruct
    public void init() {

        if (methodSecurityInterceptor instanceof MethodSecurityInterceptor) {

            AccessDecisionManager accessDecisionManager = ((MethodSecurityInterceptor) methodSecurityInterceptor).getAccessDecisionManager();
            if (accessDecisionManager instanceof AbstractAccessDecisionManager) {

                List<AccessDecisionVoter<? extends Object>> voters = ((AbstractAccessDecisionManager) accessDecisionManager).getDecisionVoters();
                // do something with voters

            } else

                throw new IllegalStateException(String.format("Access decision manager is of: %s, can't register custom voter",
                    accessDecisionManager.getClass().getSimpleName()));

        } else

            throw new IllegalStateException(String.format("Method security interceptor is of: %s, can't register custom voter",
                methodSecurityInterceptor.getClass().getSimpleName()));

    }

}