Alfresco + BIRT. Необходим опыт интеграции.
Всем привет.
Ситуация такая:
Есть BIRT (www.eclipse.org/birt/phoenix/), проще говоря - веб приложение, для работы с отчетами, в данном случае необходим только просмотр. Есть всем известная Alfresco, в которой присутствуют все необходимые пользователи.
Необходимо сделать возможность проверки пользователя из BIRT (напр.: текущий авторизованный пользователь, уровень доступа к запрошенному файлу отчета).
Пытался решить задачу следующим способом:
Расшарил все библиотеки и классы "/alfresco" в Tomcat, а именно: перенес из WEB-INF папки lib и classes в соответствующие папки Tomcat. Таким образом у нас есть возможность использовать Alfresco Java API в другом веб приложении, а именно в BIRT.
Для того, чтобы из BIRT получить доступ к Alfresco необходимо получить нужный контекст servlet'а, делал это таким образом:
public void init(HttpServletRequest request) {
Ситуация такая:
Есть BIRT (www.eclipse.org/birt/phoenix/), проще говоря - веб приложение, для работы с отчетами, в данном случае необходим только просмотр. Есть всем известная Alfresco, в которой присутствуют все необходимые пользователи.
Необходимо сделать возможность проверки пользователя из BIRT (напр.: текущий авторизованный пользователь, уровень доступа к запрошенному файлу отчета).
Пытался решить задачу следующим способом:
Расшарил все библиотеки и классы "/alfresco" в Tomcat, а именно: перенес из WEB-INF папки lib и classes в соответствующие папки Tomcat. Таким образом у нас есть возможность использовать Alfresco Java API в другом веб приложении, а именно в BIRT.
Для того, чтобы из BIRT получить доступ к Alfresco необходимо получить нужный контекст servlet'а, делал это таким образом:
public void init(HttpServletRequest request) {
servletContext = request.getServletContext().getContext("/alfresco");
XmlWebApplicationContext wac = (XmlWebApplicationContext) servletContext.getAttribute("org.springframework.web.context.WebApplicationContext.ROOT");
serviceRegistry = (ServiceDescriptorRegistry) wac.getBean(ServiceRegistry.SERVICE_REGISTRY);
}
Это дает нам возможность получить PersonService, например.
serviceRegistry.getPersonService();
При попытке вызова какого-либо метода получает Exception, который говорит нам, что не задан Security Access. Не вопрос, думая я! Ведь есть замечательный класс AuthenticationUtil, который предоставляет метод .getRunAsUser(), который возвращает строку - username пользователя, который сейчас авторизован. Это позволило бы выполнить некоторый кусок кода от имени этого пользователя - AuthenticationUtil.runAs(...).
Но вот беда! Если пытаться просто выводить этот самый username, то получается странная картина.
Если в альфреске с текущего компьютера и сессии никто не залогинен, то все правльно - получаем null и только null. Но ситуация меняется когда есть авторизованный пользователь. Тут начинается каша: мы получаем то null, то необходимый username, т.е. можно просто жать F5 и видеть каждый раз разный ответ, но при этом заметно преобладание null.
Собственно хотелось бы узнать: были ли у кого-нибудь похожие практики\задачи и как их удалось решить. Готовых решений не прошу. Мне хватит и тычка в необходимом направлении.
Это дает нам возможность получить PersonService, например.
serviceRegistry.getPersonService();
При попытке вызова какого-либо метода получает Exception, который говорит нам, что не задан Security Access. Не вопрос, думая я! Ведь есть замечательный класс AuthenticationUtil, который предоставляет метод .getRunAsUser(), который возвращает строку - username пользователя, который сейчас авторизован. Это позволило бы выполнить некоторый кусок кода от имени этого пользователя - AuthenticationUtil.runAs(...).
Но вот беда! Если пытаться просто выводить этот самый username, то получается странная картина.
Если в альфреске с текущего компьютера и сессии никто не залогинен, то все правльно - получаем null и только null. Но ситуация меняется когда есть авторизованный пользователь. Тут начинается каша: мы получаем то null, то необходимый username, т.е. можно просто жать F5 и видеть каждый раз разный ответ, но при этом заметно преобладание null.
Собственно хотелось бы узнать: были ли у кого-нибудь похожие практики\задачи и как их удалось решить. Готовых решений не прошу. Мне хватит и тычка в необходимом направлении.
Комментарии
05/08/2013 - 11:01
05/08/2013 - 19:33
А я по-прежнему жду более разговорчивого собеседника =)
08/08/2013 - 08:27
08/08/2013 - 13:49
Но при нажатии на ссылку внутри BIRT я перехожу уже в его контекст, из-за этого обнуляется request, session из Alfresco пропадает и я остаюсь без нужных мне параметров.
Есть идеи как получить из BIRT пользователя Alfresco, сессия которого хранится на данном компьютере? Либо как передать параметром, но скрытым (т.е. не GET), а затем перейти в сам BIRT.
09/08/2013 - 07:52
09/08/2013 - 09:44
Это позволит иметь доступ к BIRT через Alfresco. Это ОК.
В Alfresco я не имел дело с SSO. Какие дополнительные возможности это принесет?
Мне в итоге то нужна возможность получению текущей сессии из BIRT (т.к. в сессии хранится текущий пользователь), я смогу это сделать?
09/08/2013 - 12:00
Я бы всё-таки посмотрел на API BIRT и Alfresco подробнее — уверен, что есть нормальный способ добиться желаемого результата.