Skip to content
广告❤️成为赞助商

任务访问策略

任务访问策略类,用于判断给定的创建人员是否允许执行某个任务,指定合法参与者对象。

任务访问者策略接口

  • 实现任务访问策略接口 TaskAccessStrategy 默认判断为当前任务执行者为合法参与者对象。
java
public interface TaskAccessStrategy {

    /**
     * 根据创建人ID、参与者集合判断是否允许访问所属任务
     *
     * @param userId     用户ID
     * @param taskActors 参与者列表 传递至该接口的实现类中的参与者都是为非空
     * @return boolean 是否允许访问
     */
    boolean isAllowed(String userId, List<FlwTaskActor> taskActors);

    /**
     * 获取指定合法参与者对象
     * <p>
     * 被使用在:分配任务,解决委派任务 场景
     * </p>
     *
     * @param taskId      当前任务ID
     * @param taskActors  通过任务ID查询到的任务参与者列表
     * @param flowCreator 任务参与者
     * @return {@link FlwTaskActor}
     */
    default FlwTaskActor getAllowedFlwTaskActor(Long taskId, FlowCreator flowCreator, List<FlwTaskActor> taskActors) {
        Optional<FlwTaskActor> taskActorOpt = taskActors.stream().filter(t -> Objects.equals(t.getActorId(), flowCreator.getCreateId())).findFirst();
        Assert.isTrue(!taskActorOpt.isPresent(), "Not authorized to perform this task");
        return taskActorOpt.get();
    }
}

自定义策略接口实现

该策略继承 GeneralAccessStrategy 默认实现,并重写 isAllowed 方法,返回指定合法参与者对象。 所在源码位置 test.mysql.config

java
public class TestTaskAccessStrategy extends GeneralAccessStrategy {

    @Override
    public FlwTaskActor isAllowed(String userId, List<FlwTaskActor> taskActors) {
        if (null != taskActors) {
            // 角色部门情况测试不做验证直接允许认领,实际生产环境必须验证
            if (taskActors.stream().anyMatch(t -> !Objects.equals(0, t.getActorType()))) {
                return taskActors.get(0);
            }
        }
        return super.isAllowed(userId, taskActors);
    }
}

更适合中国人的工作流引擎