Делегирование заданий в Bproc

Снова здравствуйте!
Возникла проблема при назначении исполнителей в задании.
Есть задание №1, которое выполняет Бригадир. Следующее за ним задание №2 должен выполнять менеджер. Настройки Assignee для задания №2 следующие:
image
где переменная manager_select хранит в себе конкретного пользователя из группы “Менеджеры”.
Но дело в том, что у Бригадиров стоит ограничение на видимость пользователей, они не могут видеть пользователей из группы “Менеджеры”, поэтому в момент делегирования задания менеджеру в Assignee записывается null.
Почему механизм назначения пользователей для n+1 задания делает это от лица исполнителя n задания? Разве этим не должен заниматься сторонний сервис со всеми правами доступа?

Здравствуйте!
Воспроизвели, завели issue. Подумаем, что можно сделать.
Сейчас вы можете решить эту проблему несколькими способами:

  1. Если группа доступа у вас ограничивает только менеджеров, то назначение пользователя произвести с помощью 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 с сессией системного, а не текущего пользователя.

  1. Если у вас несколько таких процессных переменных, то назначение пользователя на таску можно сделать с помощью 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());
        }
    }
}

изображение

  1. Сделать бин с методом для загрузки пользователя, для таски указать 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;
    }
}

изображение