Получение WorklistContext и выполнение задач в Weblogic Integration

Чтобы получить исходный контекст Weblogic для запроса базы данных задач, я делаю следующее:

Properties h = new Properties();
h.put(Context.SECURITY_PRINCIPAL, "weblogic");
h.put(Context.PROVIDER_URL, "t3://localhost:17101");
h.put(Context.SECURITY_CREDENTIALS, "weblogic");
h.put(Context.SECURITY_AUTHENTICATION, "simple");
WLInitialContextFactory test = new WLInitialContextFactory();
test.getInitialContext(h);

Context ctx = null;
ctx = getInitialContext();
WorklistContext wliContext = WorklistContextFactory.getRemoteWorklistContext(ctx, "MyTaskApplication");

Затем я получаю интерфейс TaskQuery со следующим кодом:

WorklistTaskQuery taskQuery = wliContext.getInterfaceForTaskQuery();

и чтобы получить задачи, которые я делаю:

taskQuery.getTasks(query);

где запрос - это объект com.bea.wli.worklist.api.TaskQuery.

Обратите внимание, что этот код выполняется внутри домена, в котором выполняются задачи.

К сожалению, я получаю следующую ошибку при вызове методов getTasks:

java.lang.SecurityException: [WLI-Worklist:493103]Access denied to resource /taskplans
/Manual:1.0. Applicable policy: Query Caller: principals=[] Method: com.bea.wli.worklist.security.WorklistSecurityManager.assertTaskAccessAllowed

Кажется, что Weblogic игнорирует пользовательский набор в новом начальном контексте и пытается использовать тот, который поступает из браузера. Бывает так, что мне может потребоваться выполнить поиск запросов в фоновых рабочих, которые не имеют сессии браузера (очевидно).

Может кто-нибудь помочь с этим?

1 ответ

Я нашел решение для этого, хотя оно извилистое и ужасное.

Поскольку я делаю эти вызовы через EJB, я могу аутентифицировать вызов, извлекая реализацию EJB из аутентифицированного контекста, например так:

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.SECURITY_PRINCIPAL,"user");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
env.put(Context.SECURITY_CREDENTIALS,"password");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
getSessionInterface(interfaceClass, new InitialContext(env));

Лучше всего для этого избегать приведенного выше примера и этого API. Просто используйте обычную реализацию MBean, которая позволяет аутентификацию.

Обновление этого решения не представляется жизнеспособным, оно испортит управление транзакциями. Отчитается, но если вам нужно создавать задачи вне аутентифицированного контекста, вам нужно пойти по пути MBean

Другие вопросы по тегам