Получение WorklistContext и выполнение задач в Weblogic Integration - PullRequest
0 голосов
/ 17 ноября 2010

Чтобы получить исходный контекст 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 Ответ

0 голосов
/ 19 ноября 2010

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

Поскольку я делаю эти вызовы через 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

...