【问题标题】:How to add voters to the default AccessDecisionManager?如何将选民添加到默认的 AccessDecisionManager?
【发布时间】:2015-07-10 11:56:30
【问题描述】:

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

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

即使是 spring security 的建议示例 (https://spring.io/blog/2009/01/03/spring-security-customization-part-2-adjusting-secured-session-in-real-time) 也使用这种方法。

我还在http://forum.spring.io/forum/spring-projects/security/109476-how-to-add-voters-to-the-default-accessdecisionmanager?p=570570#post570570 找到了一个很有前途的解决方案,它可能会使用 bean 后处理器向任何 AbstractAccessDecisionManager 添加额外的投票者,但方法 setDecisionVoters(这种解决方案的关键)已被弃用,因此它是没有问题的。

所以,我想知道是否有某种方法可以将我的选民添加到当前的 AccessDecisionManager 而无需处理它。有什么想法吗?

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:
    @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()));
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      AfirmativeBean 扩展 AbstractAccessDecisionManager。只需使用 getDecisionVoters() 并将其添加到列表中

      AfirmativeBean  afirmativeBean = (AfirmativeBean)bean);
      afirmativeBean.getDecisionVoters().add(yourvoter);
      

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多