Добрый день!
Связки security ролей и процессных ролей из коробки нет. Как вариант, можно делать так: в модели процесса перед задачей вызвать сервис таску, которая создаст необходимые экземпляры ProcActor. Т.е. модель у вас будет выглядеть так:
Expression у ServiceTask:
${sample_ProcRolesHelper.fillProcRoles('approver', 'approverSec', bpmProcInstanceId)}
Ну и собственно сам ProcRolesHelper:
@Component(ProcRolesHelper.NAME)
public class ProcRolesHelper {
public static final String NAME = "sample_ProcRolesHelper";
@Inject
private Logger log;
@Inject
private DataManager dataManager;
@Inject
private Metadata metadata;
public void fillProcRoles(String procRoleCode, String secRoleName, UUID bpmProcInstanceId) {
ProcInstance procInstance = dataManager.load(ProcInstance.class)
.id(bpmProcInstanceId)
.view("procInstance-listener-view")
.one();
Optional<ProcRole> procRoleOpt = procInstance.getProcDefinition().getProcRoles().stream()
.filter(procRole -> procRole.getCode().equals(procRoleCode))
.findAny();
if (!procRoleOpt.isPresent()) {
log.error("ProcRole {} not found", procRoleCode);
return;
}
List<User> usersWithSecRole = findUsersBySecRole(secRoleName);
List<ProcActor> procActorsToCreate = new ArrayList<>();
for (User user : usersWithSecRole) {
ProcActor procActor = metadata.create(ProcActor.class);
procActor.setUser(user);
procActor.setProcInstance(procInstance);
procActor.setProcRole(procRoleOpt.get());
procActorsToCreate.add(procActor);
}
dataManager.commit(new CommitContext(procActorsToCreate));
}
private List<User> findUsersBySecRole(String secRoleName) {
return dataManager.load(User.class)
.query("select u from sec$User u join u.userRoles ur join ur.role r where r.name = :secRoleName")
.parameter("secRoleName", secRoleName)
.list();
}
}
Демо-проект: bpm-assignment-sample.zip (110.4 КБ)
Что касается добавления пользователя в уже созданную задачу, то тут вам скорее всего придётся как-то в своём проекте отслеживать назначение пользователю security роли, где-то хранить информацию, какие proc-роли с ней связаны, находить экземпляры ProcTask
и апдейтить у них коллекцию candidateUsers
.