Spring-security — AccessDecisionVoter-impl не будет вызываться


Я пытаюсь создать пользовательский AccessDecisionVoter и просто останавливаю его в отладке, когда он вызывается.

Я поставил точку останова в каждом методе, но ничего не произошло.

spring-security.xml:

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
  <property name="decisionVoters">
     <list>
          <bean class="com.affiliates.server.security.voters.VoterTest">
              <property name="brandsApi"  ref="brandsApi"/>
          </bean>
        </list>
  </property>

IBrandsApi.java

    public interface IBrandsApi {

    IHibernateBean getByPK(Integer id);

    @Secured({ "ROLE_BRAND_ADMIN" })    
    IHibernateBean update(IHibernateBean brand);

    @Secured({ "ROLE_BRAND_ADMIN" })    
    IHibernateBean insert(IHibernateBean brand);

    @Secured({ "ROLE_BRAND_ADMIN" })    
    ResultContainer getAll(IFilter filter);

    @Secured({ "ROLE_ADMIN" })  
    Integer delete(IFilter filter); 
}

VoterTest.java (пустой файл с контрольными точками)

    public class VoterTest implements AccessDecisionVoter {
private IBrandsApi brandsApi;

    public IBrandsApi getBrandsApi() {
        return brandsApi;
    }

    public void setBrandsApi(IBrandsApi brandsApi) {
        this.brandsApi = brandsApi;
    }

        @Override
        public boolean supports(ConfigAttribute attribute) {
            System.out.println("here");
            return false;

        }

        @Override
        public boolean supports(Class<?> clazz) {
            System.out.println("here");
            return false;
        }

        @Override
        public int vote(Authentication authentication, Object object,
                Collection<ConfigAttribute> attributes) {
            System.out.println("here");
            return 0;
        }
    }

Кстати, во время загрузки/запуска приложения исключений не было. Спасибо.


person fatnjazzy    schedule 13.03.2011    source источник
comment
У вас есть ‹global-method-security secure-annotations=enabled /›?   -  person Boris Kirzner    schedule 13.03.2011
comment
да, я могу использовать аннотацию и @Autowire spring bean-компоненты, спасибо   -  person fatnjazzy    schedule 13.03.2011


Ответы (1)


Вам нужно использовать свой пользовательский AccessDecisionManager, в противном случае используется по умолчанию. Вы можете сделать это с

<global-method-security access-decision-manager-ref="accessDecisionManager"/>

Взгляните на документацию для получения дополнительной информации об этом.

Еще одна вещь: методы supports() в вашем избирателе, вероятно, должны возвращать true, иначе vote() не будет вызываться.

person Gerhard Schlager    schedule 13.03.2011