# 匿名用户流程设计指引

# 基础概念

在流程的设计需求中,会出现需要由不具有jAccount账号的用户发起或者办理的要求,此类流程称为匿名用户流程。

  • 用户登录

流程的发起和办理必须有确定的登录用户,因此尽管用户没有jAccount,仍然需要登录为流程平台的内置用户,以便获得相应的发起和办理权限。
流程平台不管理用户密码,因此内置用户不能主动登录,平台通过特殊发起链接和特殊办理链接实现用户的自动登录。

  • 用户生成

流程平台提供API接口来实现内置用户的创建(见API 5.2)。
为了简化开发过程,平台同时预创建了101个内置用户(AnonymousUser、AnonymousUser000 ~ AnonymousUser099), 并将其置于匿名用户岗(BuiltInAnonymous)下,可直接用户匿名流程的开发。

  • 权限控制

考虑到内置用户登录的特殊性,平台对用户访问流程实例的权限进行了限制。
内置用户仅可以访问由特殊发起链接发起的流程实例,或者由特殊办理链接指定的流程实例,通过修改链接中包含的流水号等参数,通常将遇到无权限错误, 除非在同一个浏览器会话中,该流水号代表的实例已经通过特殊发起链接或者特殊办理链接得到授权。

# 匿名用户发起流程

匿名用户发起流程指允许内置用户发起的流程。

该流程的设计与普通流程的区别仅仅在于其发起节点的执行岗位包含了内置用户。流程的发起通过在正常发起链接上附加以下参数形成特殊发起链接:

参数名 可选 取值说明
uid 可选 需要登录的内置用户的guid
不提供时默认为预创建用户AnonymousUser的guid
express 必选 固定为true

由于内置用户需要使用特殊发起链接实现登录,业务需要自行设计该发起链接的分发途径,通过正常的服务大厅无法发起。

基于上述设计,最简单的匿名用户发起流程可以在发起节点上配置执行岗位为匿名用户岗(BuiltInAnonymous),在发起链接上附加express=true即可。
开发者需要意识到在上述配置下,该流程的发起节点实际执行人账号将为AnonymousUser,如果存在退回该节点的动作,则该节点需要配置执行人限定。 可以通过表单变量限定为流程创建人,或者通过常量限定直接限定为AnonymousUser。推荐通过表单变量限定。

# 匿名用户参与流程

匿名用户参与流程指流程的中间环节需要内置用户参与办理。

该流程的设计与普通流程的区别在于其中间节点的执行岗位包含了内置用户,需要配置待办通知以便用户能够通过待办通知邮件获取到特殊办理链接,一般通过配置待办通知中的通知对象,将待办通知发送到实际用户的邮箱中。
特殊办理链接由流程平台自动产生,并附加到发送给内置用户的待办通知内容之后,开发者无需关心链接的形成细节,此处的说明仅供开发者了解细节:

附加到待办通知后的内容如下:

此邮件由系统自动发送,请勿直接回复。请点击以下链接查看您的事项,一天内有效:
https://form.sjtu.edu.cn/infoplus/form/12345/render?uid=2567e8b0-d626-4b9b-85f6-658973c6f048&ts=1634567832&sig=ab23ef87da1230423
1
2

特殊办理链接是在普通办理链接上附加以下参数形成:

参数名 说明
uid 可办理该步骤的内置用户的guid
ts 该链接的有效期,unix时间戳,当前固定为1天
sig 链接的防篡改签名

基于上述设计,最简单的匿名用户参与流程可以在参与节点上配置执行岗位为匿名用户岗(BuiltInAnonymous),并通过执行人限定将可执行人限定为唯一用户。 由于匿名用户岗中含有101个用户,在没有限定的情况下,流程编辑器将不允许保存流程定义。

对于单一匿名用户参与的流程,可限定为常量AnonymousUser。

对于多个匿名用户参与的流程,可分别限定到AnonymousUser000 ~ AnonymousUser099中的任意一个。

较为常见的应用场景是匿名用户使用了重复结构存储,并使用动态并行分发给多个内置用户,如外审专家。推荐的做法是在此重复结构中定义一个表单变量,按照数据所在行号产生对应的内置用户账号名, 如第0行对应到AnonymousUser000、第1行对应到AnonymousUser001,然后在执行限定中通过此表单变量来限定执行人。要实现对重复结构中用于限定人的表单变量赋值,可以采用messenger里doing事件处理,也可以采用前端使用动态公式的方式。后端处理只需对重复结构循环,按照行赋予字段AnonymousUser000,AnonymousUser001这样的值即可。使用前端动态公式,可在这个表单变量上配置动态值:'AnonymousUser'+right('00'+$INDEX,3)。

开发者需要意识到,对于业务场景中同一个流程实例中的不同匿名用户,应该将其对应到不用的内置用户上,否则可能出现越权访问。