Снова здравствуйте!
Возникла проблема при назначении исполнителей в задании.
Есть задание №1, которое выполняет Бригадир. Следующее за ним задание №2 должен выполнять менеджер. Настройки Assignee для задания №2 следующие:
где переменная manager_select хранит в себе конкретного пользователя из группы “Менеджеры”.
Но дело в том, что у Бригадиров стоит ограничение на видимость пользователей, они не могут видеть пользователей из группы “Менеджеры”, поэтому в момент делегирования задания менеджеру в Assignee записывается null.
Почему механизм назначения пользователей для n+1 задания делает это от лица исполнителя n задания? Разве этим не должен заниматься сторонний сервис со всеми правами доступа?
Здравствуйте!
Воспроизвели, завели issue. Подумаем, что можно сделать.
Сейчас вы можете решить эту проблему несколькими способами:
- Если группа доступа у вас ограничивает только менеджеров, то назначение пользователя произвести с помощью UserProvider:
@Component("sample_ManagerProvider")
public class ManagerProvider implements UserProvider {
@Inject
private Authentication authentication;
@Inject
private BprocRuntimeService bprocRuntimeService;
@Override
public User get(String executionId) {
AtomicReference<User> user = new AtomicReference<>();
AppContext.withSecurityContext(null, () -> {
authentication.begin();
try {
user.set((User) bprocRuntimeService.getVariable(executionId, "manager"));
} finally {
authentication.end();
}
});
return user.get();
}
}
Данный провайдер зачитает значение процессной переменной manager
с сессией системного, а не текущего пользователя.
- Если у вас несколько таких процессных переменных, то назначение пользователя на таску можно сделать с помощью TaskListener на событие create. Имя переменной можно будет задать при конфигурации слушателя в моделере.
public class AssignmentTaskListener implements TaskListener {
private Expression variableName;
@Override
public void notify(DelegateTask delegateTask) {
Authentication authentication = AppBeans.get(Authentication.class);
String variableNameValue = (String) variableName.getValue(delegateTask);
AtomicReference<Object> variableValue = new AtomicReference<>();
AppContext.withSecurityContext(null, () -> {
authentication.begin();
try {
variableValue.set(delegateTask.getVariable(variableNameValue));
} finally {
authentication.end();
}
});
Object value = variableValue.get();
if (value instanceof User) {
UUID userId = ((User) value).getId();
delegateTask.setAssignee(userId.toString());
}
}
}
- Сделать бин с методом для загрузки пользователя, для таски указать Assignee source expression и написать там выражение для вызова метода бина:
${sample_UserLoader.load('manager', execution.id)}
@Component("sample_UserLoader")
public class UserLoader {
@Inject
private BprocRuntimeService bprocRuntimeService;
@Inject
private Authentication authentication;
public String load(String variableName, String executionId) {
AtomicReference<User> userAtomic = new AtomicReference<>();
AppContext.withSecurityContext(null, () -> {
authentication.begin();
try {
userAtomic.set((User) bprocRuntimeService.getVariable(executionId, variableName));
} finally {
authentication.end();
}
});
User user = userAtomic.get();
return user != null ? user.getId().toString() : null;
}
}