2014-03-14 3 views
2

Я создаю приложение, которое работает в Karaf как контейнер OSGi, и использует HTTP-службу OSGi и Jersey для отображения API REST. Мне нужно добавить аутентификацию SAML2 и авторизацию на основе разрешений. Я хотел бы использовать подход, основанный на аннотациях, в Сиро для этого, поскольку весна, похоже, отходит от OSGi. Мои вопросы:Shiro с SAML2 в Karaf с JAX-RS (Джерси)

  1. Является ли Shiro с банками SAML подходящим для OSGi?
  2. Я хочу использовать WSO2 в качестве поставщика удостоверений. Существуют ли какие-либо предостережения Shiro и WSO2, работающие вместе?
  3. Для использования аннотаций в документах Shiro указывается, что мне нужно поставить баннеры AspectJ/Spring/Guice - это все еще актуально в средах OSGi? Я бы предпочел, чтобы Guice для всех моих потребностей DI.

Было бы здорово иметь некоторые идеи от пользователей Shiro.

UPDATE

Я использую этот проект: osgi-jax-rs-connector. Таким образом, я использую Guice-Peaberry для регистрации служб OSGi с интерфейсами, аннотированными с помощью @Path или @Provider, и этот инструмент заботится о преобразовании их в ресурс REST. (Подобно pax-whiteboard?). Я планировал аналогичным образом подвергать свои фильтры сервисам OSGi, а затем динамически добавлять их вместе с ресурсами.

У меня были головные боли с AspectJ в OSGi в предыдущем проекте, где мне пришлось переключиться на ванильное равноденствие от Karaf, потому что крюк для равноденствия не соглашался с Karaf (среди прочего, были обнаружены следы стека с Овна). Итак, будет ли что-то вроде shiro-jersey быть лучше?

ответ

1

В интересах читателей я разделяю решение, к которому я пришел, после некоторого исследования существующих инструментов. Во-первых, легкая часть: использование аннотаций Shiro в среде OSGi. Я закончил тем, что написал класс ниже, поскольку большинство адаптеров Shiro-Jersey, разделяемых разработчиками, основаны на Jersey 1.x.

 

    @Provider 
    public class ShiroAnnotationResourceFilter implements ContainerRequestFilter { 

     private static final Map, AuthorizingAnnotationHandler> ANNOTATION_MAP = new HashMap, AuthorizingAnnotationHandler>(); 

     @Context 
     private ResourceInfo resourceInfo; 

     public ShiroAnnotationResourceFilter() { 
      ANNOTATION_MAP.put(RequiresPermissions.class, 
        new PermissionAnnotationHandler()); 
      ANNOTATION_MAP.put(RequiresRoles.class, new RoleAnnotationHandler()); 
      ANNOTATION_MAP.put(RequiresUser.class, new UserAnnotationHandler()); 
      ANNOTATION_MAP.put(RequiresGuest.class, new GuestAnnotationHandler()); 
      ANNOTATION_MAP.put(RequiresAuthentication.class, 
        new AuthenticatedAnnotationHandler()); 
     } 

     public void filter(ContainerRequestContext context) throws IOException { 

      Class resourceClass = resourceInfo.getResourceClass(); 
      if (resourceClass != null) { 
       Annotation annotation = fetchAnnotation(resourceClass 
         .getAnnotations()); 
       if (annotation != null) { 
        ANNOTATION_MAP.get(annotation.annotationType()) 
          .assertAuthorized(annotation); 
       } 
      } 

      Method method = resourceInfo.getResourceMethod(); 
      if (method != null) { 
       Annotation annotation = fetchAnnotation(method.getAnnotations()); 
       if (annotation != null) { 
        ANNOTATION_MAP.get(annotation.annotationType()) 
          .assertAuthorized(annotation); 
       } 
      } 
     } 

     private static Annotation fetchAnnotation(Annotation[] annotations) { 
      for (Annotation annotation : annotations) { 
       if (ANNOTATION_MAP.keySet().contains(annotation.annotationType())) { 
        return annotation; 
       } 
      } 
      return null; 
     } 
    } 

Полный проект here. Вышеизложенное позаботилось о третьей части моего вопроса.

Для Shiro с SAML я использую обернутую банку openSAML с Servicemix, и до сих пор она работает нормально.Однако мне пришлось написать немного кода, чтобы заставить Сиро работать с SAML2. Это почти на том же уровне, что и shiro-cas, но немного более общий для использования с другими IdP. Код очень важен, поэтому он использует ссылку на проект вместо копирования классов в SO. Он может быть найден here.

Теперь, когда у меня есть абстракция между моим кодом и моим IdP, интеграция WSO2 выглядит немного проще.

P.S. Спасибо Achim за ваши комментарии и предложения.

1

Я уверен, что это выполнимо, хотя я уже вижу некоторые ограничения/проблемы, возникающие. для 1) не пробовал, хотя вам нужно убедиться, что вы сообщите об этом в pax-web и причал, вам потребуется добавить это в файл jetty.xml, и ему может понадобиться добавить фрагмент на pax-web-jetty, чтобы можно было загрузить желаемый класс. Скорее всего, это будет ваша первоклассная проблема.
2) не знаю WSO2, так что не знаю
3) если вы хотите использовать аннотации, будьте осторожны. Для Guice вам, скорее всего, понадобится использовать Peaberry, так как afaik Guice еще не «OSGi-fied». Использование AspectJ на самом деле не является хорошей идеей в среде OSGi из-за ограничений класса загрузчика. Если у вас есть соткание во время компиляции, это должно быть хорошо, но вождение во времени будет проблемой.

ОБНОВЛЕНИЕ: Полностью забыли об этом, но есть проект Pax Shiro, возможно, это может быть хорошей отправной точкой для получения вашей настройки в правильном составе.

+0

Я только что обновил вопрос с дополнительной информацией. Ранее я использовал ванильный Equinox, Equinox Weaving, Gemini Blueprint, и, хотя он работал в конечном счете, я не был доволен этим массовым списком зависимостей Spring. Поэтому, пытаясь сделать все как можно легким. Для начала, используя Овен, для областей, где Peaberry не совсем зрелый (например, ConfigAdmin и автоматические преобразования типов). – Aritra

+0

см. Обновление, Pax Shiro может представлять интерес –

+0

Я не могу получить доступ к URL-адресу pax shiro. Многое происходит с страницами PAX. Некоторая ошибка авторизации. – Aritra