Как защитить несколько конечных точек с помощью SecureAnnotationsInterceptor (Apache CXF)?
Я использую Apache CXF, и я хотел бы использовать SecureAnnotationsInterceptor
чтобы обеспечить мою конечную точку с @RolesAllowed
аннотаций.
Насколько я понимаю, я должен сказать перехватчику, какой объект защищать, передавая ссылку на setSecuredObject
метод.
К сожалению, код не предназначен для обработки списка бинов.
Затем я задаюсь вопросом, как защитить несколько конечных точек с помощью этого перехватчика.
Должен ли я создать свою собственную версию этого перехватчика или создать несколько его экземпляров (по одному на конечную точку для защиты) или что-то еще?
2 ответа
Я не знаю, нашел ли ты ответ. Для меня, я изменил этот перехватчик 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());
}
}
}
Извините, что это ответ, так как у меня недостаточно представителя, чтобы прокомментировать ответ Ахмеда М. Фаргали. С вышеупомянутой реализацией мы столкнулись с проблемой, где мы аннотировали интерфейсы с помощью @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);
}