2014-01-15 4 views
0

Я использую Apache CXF, и я бы хотел использовать SecureAnnotationsInterceptor для защиты моей конечной точки с помощью аннотации @RolesAllowed.Как защитить несколько конечных точек с помощью SecureAnnotationsInterceptor (Apache CXF)?

Насколько я понимаю, я должен сообщить перехватчику, который защищает объект, передавая ссылку на метод setSecuredObject.

К сожалению, код не предназначен для обработки списка компонентов.

Мне интересно, как обеспечить защиту нескольких конечных точек этим перехватчиком.

Должен ли я создать свою версию этого перехватчика или создать несколько экземпляров (по одному на конечную точку для защиты) или что-то еще?

ответ

0

Я не знаю, нашли ли вы ответ. Для меня, я изменил setSecuredObject метод этого перехватчика следующим образом:

public void setSecuredObjectsList(Object[] objects) { 

    Map<String, String> rolesMap = new HashMap<String, String>(); 
    for (Object o:objects) { 
     setSecuredObject(o, rolesMap); 
    } 

    super.setMethodRolesMap(rolesMap); 
} 


public void setSecuredObject(Object object, Map<String, String> rolesMap) { 
    Class<?> cls = ClassHelper.getRealClass(object); 
    findRoles(cls, rolesMap); 
    if (rolesMap.isEmpty()) { 
     LOG.warning("The roles map is empty, the service object is not protected"); 
    } else if (LOG.isLoggable(Level.FINE)) { 
     for (Map.Entry<String, String> entry : rolesMap.entrySet()) { 
      LOG.fine("Method: " + entry.getKey() + ", roles: " + entry.getValue()); 
     } 
    } 
} 
+0

thx, вот что я сделал – poussma

1

К сожалению, что это ответ, так как я не хватает респ прокомментировать ответ Ахмеда M Farghali в. В приведенной выше реализации мы столкнулись с проблемой, когда мы аннотировали интерфейсы с помощью @RolesAllowed, но не все конечные точки были защищены. Оказывается, findRoles() проверяет суперкласс, если roleMap пуст. При первом запуске это происходит правильно, но поскольку roleMap повторно используется, другие службы не будут защищены. Мы исправили это, изменив метод setSecuredObject на:

public void setSecuredObject(Object object, Map<String, String> rolesMap) { 
    Class<?> cls = ClassHelper.getRealClass(object); 
    Map<String, String> instanceRoleMap = new HashMap<>(); 
    findRoles(cls, instanceRoleMap); 
    if (instanceRoleMap.isEmpty()) { 
     LOG.warning("The roles map is empty, the service object is not protected"); 
    } else if (LOG.isLoggable(Level.FINE)) { 
     for (Map.Entry<String, String> entry : instanceRoleMap.entrySet()) { 
      LOG.fine("Method: " + entry.getKey() + ", roles: " + entry.getValue()); 
     } 
    } 
    rolesMap.putAll(instanceRoleMap); 
} 
Смежные вопросы