账号系统是iVX中进行应用访问权限控制的核心组件,是连接“用户”与“应用”的门户网关。其大致工作流程如下:
首先,用户登录账号系统,账号系统会根据用户的身份认证信息,生成一个登录令牌返回给用户。这个登录令牌会作为cookie信息的一部分,存储在用户的客户端浏览器上;
随后,用户每次访问应用前,都会先访问账号系统进行鉴权,然后账号系统会根据用户请求头中带有的身份令牌信息,判断这个请求是否合法,如合法则继续将请求传递给目标应用进行处理,不合法则直接拒绝请求。
在iVX中,账号系统是一个独立于应用存在的资源,因此不同的应用可以使用同一个账号系统进行鉴权,以实现多应用的统一认证登录(SSO)。
iVX的账号系统,基于RBAC权限系统设计,即基于角色的访问控制系统,其大致模型如下:
1、首先,每个用户会被应用管理员分配一个或多个角色,比如员工,管理员,客服等等,角色的分配方案可以由管理员动态修改,比如,一个员工离职之后,管理员可以在后台将其的员工角色移除,这样该用户就无法继续使用公司内部系统功能了;
2、每个角色,进一步对应一个或多个权限项,每个权限项,都对应某个具体的应用功能,比如“人事”这个角色,可以有“添加人员”与“查看工资”两个权限项。和用户角色类似,每个角色所对应的权限项,也是可以由管理员动态设置的,比如,管理员可以新增一个角色“人事助理”,这个角色,只有“添加人员”这个权限项,但是没有“查看工资”的权限项;
3、每个权限项,最终需要落实到具体的应用功能,比如,“查看工资”这个权限项,需要对应一个输出工资列表的服务,以及一个获取某用户工资数据的服务,另外,还可以额外设置相关前端元素的显示规则,即只有拥有“查看工资”权限项的用户,才能够看到相关页面的入口按钮。每个权限项对应具体什么功能,是由开发者在应用开发时定义好的,是应用代码逻辑的一部分。
以上三组关系,实现了用户=》应用功能的完整关系链条,让系统可以根据用户的身份,来判断其可使用哪些功能,不可使用哪些功能。
三组关系中的每一组其实都是多对多的关系,我们在下图中举了一个更直观的例子:
在以上关系图中,假设一个用户,登录为访客,当他想调用“更新人员数据”服务时,后台会根据访客角色的关系配置,查找出其对应的权限项为“查看新闻”,然后进一步找到其对应的功能仅包含“输出新闻数据服务”,而不包含“更新人员数据服务”,因此就会拒绝这个服务的访问。
在iVX中,以上三组关系的设置方法如下:
1、用户-》角色的关系,是存储在用户数据系统中的,这个用户数据系统是独立于用户权限配置功能的系统,可以是一个自建的用户数据表,或来自某个第三方API(oAuth2),但无论数据来源如何,都需要记录下每个用户的角色信息,比如,将角色信息存在一个自建用户数据表的“角色”字段中:
2、角色-》权限项的关系,是存在账号系统组件的配置信息中的。账号系统组件,是一个资源类的组件,即其是独立于应用存在的,我们需要在后台资源面板中创建并编辑账号系统资源:
账号系统中的角色-》权限关系配置,可通过账号系统组件提供的动作,在服务中动态修改,也可以在编辑器中提供的界面,初始化一些配置:
服务中配置:
编辑器中配置:
我们可以将账号系统的角色配置,理解成数据库中的数据,我们可以在服务中对数据库的数据进行修改,也可以在编辑器界面中查看并初始化一些数据。
3、权限项-》应用功能关系配置,是在iVX的前后台根组件中。首先,每个应用可以从账号系统资源列表中,添加一个账号系统资源至后台根下。添加之后,前台根和后台根下的“编辑权限”按钮就会变成可点状态,点击编辑,可以将后台服务与前端UI组件添加至列表中,然后勾选其对应的权限。比如,下图中显示了一个简单的后台服务权限编辑界面:
更详细的操作方法请见下文“配置应用权限”小节。
在iVX编辑器中我们点击后端资源,之后选择账号系统,此时界面中展示了当前账号已有的账号系统资源,我们可以选择任意一个添加至当前应用(注意每个应用只能添加一个账号系统组件)。
如需新增,我们点击右上角【新增账号系统】按钮,并在弹窗中输入账号系统名称,然后点击【确认新增】。
新增成功后,编辑器内会弹窗提示开发者下一步去配置权限和角色,点击【前往配置】即可进入下面的配置权限树和角色操作。如果应用内不涉及权限相关的限制功能,可以点X关闭此弹窗。
在后台资源-账号系统面板选中一个账号系统,之后点击右侧的【权限与角色】按钮进入配置界面。首先,我们需要先设置权限分组,点击下方【+新增分组】按钮。
下一步,设置分组名和组内权限项。新增组内权限项时,我们需要点击右侧的【+新增】,之后在弹窗中输入权限项名称和设置标签色值。权限项的标签色值可便于我们在编辑器里更直观的区分不同权限项,并不会影响功能。
注意:权限项名称设置后无法修改,如果名称设置错误则需要删除该项后再新建。
在分组名右侧的[...]菜单中提供了新增子分组和删除功能,我们可以设置多级权限分组。此外,分组列表还支持通过鼠标按下拖动来调整分组间的顺序和层级。
完成权限设置后,请记得点击保存设置按钮。
在账号系统中角色是可以设置预览和发布环境两套数据的。新建的账号系统初始没有角色设置,因此我们先在预览版角色下点击【+新增角色】按钮进行新增。点击后,角色列表中会多出一个未命名角色,之后我们在在右侧编辑改角色的名称、描述和角色具备的权限。
角色权限位置展示的权限树和权限管理中的设置一致,文件夹图标对应权限分组,令牌图标对应权限项,权限分组可以点击加号展开,减号折叠,点击权限组左侧的勾选框可将整组全选/全不选。另外,我们也可以单独勾选/取消某个权限项。
发布版和预览版角色数据之间可进行同步,例如当我们保存好预览版角色设置后,在发布版角色页点击右上角【同步预览版数据】按钮,确认同步操作后发布版角色便会设置成与预览版相同的角色数据,不需要再逐个手动添加。
注意:同步操作会直接覆盖数据,且数据被覆盖后不可恢复,请谨慎操作。
当账号系统被加入应用后台后,我们也可以通过账号系统的属性面板的角色与权限选项进入上述界面。
前端组件权限配置
我们需要先从后端资源中选择一个完成角色和权限配置的账号系统加入应用,之后选中对象树-前台,在前台属性面板下点击前台权限的【编辑】按钮。
在右侧展开的面板中我们点击加号在当前权限组下添加一行设置,并通过鼠标点选方式将需要被权限控制是否显示的前端可视组件加入。组件加入后,使用右侧的勾选框将其与组内权限项进行绑定。
完成分组内的权限配置后,请记得点击保存设置按钮。
注意:登录token有变化需要添加设置应用系统-》组件鉴权,才能控制关联组件的根据权限显示/隐藏,比如在生成登录token和重置登录token完成后添加设置
后台组件权限配置
后台权限配置方法与前台操作相似。我们选中对象树-后台,点击后台属性面板下的后台权限【编辑】按钮。
在右侧展开的面板中我们点击加号在当前权限组下添加一行设置,并通过鼠标点选方式将需要的后台服务加入。后台服务加入后,使用右侧的勾选框将其与组内权限项进行绑定。
完成分组内的权限配置后,请记得点击保存设置按钮。
进入后台资源-账号系统界面,选中一个账号系统,点击右侧【数据管理】按钮后可查看服务器登录换成数据。在iVX中,登录缓存数据也同样分为预览和发布版两个环境。
此外,我们可以通过对象树中账号系统的属性面板的数据管理选项进入上述界面。
需要开发者自建一个数据表管理账号密码,并实现账号密码、注册信息的验证逻辑,验证通过成功使用账号系统的生成登录token方法实现登录,建议注册后分配一个固定的初始角色。
demo体验地址 demo下载地址
接入第三方登录
接入第三方登录时,可不在应用内添加账号数据表,但开发者要需要自己写加一些API、自定义函数、动作组或SDK实现登录对接,实际请按照第三方提供的文档来做。常见的方法例如通过API拿授权码再获取当前用户信息、跳转指定url拿到第三方登录凭证、cookie同主域策略等。
拿到第三方登录凭证(含用户信息)视为第三方平台登录验证通过,接下来要实现iVX应用的后台登录,我们只需要调用账号系统-生成登录token的动作,并传入刚刚拿到的用户信息和角色。在登录token有效期内,我们都可以通过解析登录token来获取当前登录用户,若token失效则再次执行第三方登录并生成新的登录token。
举个简单的例子:对接微信登录,我们通过接口拿到的openid/unionID、微信头像和昵称,但没有角色。前文提到,生成登录token需要用户ID、信息和角色,若角色为空则没有任何权限,只能使用不受权限控制的界面元素和服务。接下来我们可以,
1)把微信接口拿到的用户openid或unionID作为用户ID,头像昵称等作为用户信息;
2)角色可填[](不建议为空)或指定某个初始用户角色,如["微信用户"];
3)通过账号系统的生成登录token动作实现应用内登录。
微信扫码体验 demo下载地址
另一个例子演示如何接入Azure的oAuth2登陆
1、根据Azure文档,OAuth2登陆一般包含三个步奏,获取授权并跳回原始页码,通过授权码code换取token,通过token获取用户信息;
2、获取用户信息后使用iVX账号系统获取登陆token;
demo体验地址 demo下载地址
实现固定角色权限划分
固定角色权限简单来说就是,账号创建时被分配好的角色权限会一直保持不变,不需要再经常调整。例如,在电商购物端注册的账号固定分配消费者角色,在商户端注册的账号默认分配商户角色。针对此类系统需求,我们只需在账号系统组件中配置好权限和角色表,之后在每个账号新建时为角色字段填入之前建好的角色名即可。后台是根据角色名称来匹配相关权限,注意名称不要填写错误。
后期如需调整,开发者可以直接在账号系统-角色和权限配置中进行修改和更新。但如果我们的系统需要提供给使用者一个动态分配角色权限的功能页,则需要参考下文进行额外的开发。
一般中大型系统会需要由管理员在使用过程中对员工角色和所含权限随时调整,这时需要实现动态角色权限划分。管理界面首先我们可以使用账号系统组件的方法将当前系统角色配置直观展示出来,需要开发的角色配置操作方法如下: