qtcxc 发表于 2019-8-26 12:10:45

抛砖引玉--权限管理基础模型

本帖最后由 qtcxc 于 2019-8-27 17:15 编辑

      用活字格已经过了大半年了,一边用一边学,期间遇到了各种各样的问题大部分都通过官方的技术支持解决,也有很多是通过论坛中格友们分享的各种帖子获取灵感得到启发解决。
      所以一直来都有想给社区贡献一点东西的想法,但是迟迟没有做(主要是手上没货)。
      今天工程还在赶制中,任务已经安排在不同的人身上各自负责各自的模块,我负责的部分暂时告一段落,在等待同事的模块完成的空隙抽点时间把这个想法付诸行动,能拿点什么分享呢?目前工程很多业务逻辑都比较特殊,其它行业也不一定用得上,所以挑一个相对基础的功能“基础权限管理模型”来分享。
      可能有格友会问,活字格不是集成有权限管理功能吗,你的“基础权限管理模型”又有什么用呢?
      其实,活字格自带的权限管理功能还是比较全面的,对于一般的公司边开发边用都是能满足需求的,但是自带的权限管理功能跟程序功能是深度耦合的,一旦权限变更则需要动用设计器更改程序规则代码来进行调整,调整完成后重新发布工程来实现权限规则变更。工程较小功能较单一的情况下这样做完全没有问题的。
   但是当工程稍微大一点,做任何的重新发布动作都是一种风险,需要承担重新发发布可能引起的人为的不可控的风险。出于这种原因,我们需要在活字格现有的权限管理基础上构建一套松耦合的权限管理框架,目的是让程序发布后大部分的权限调整直接在发布后的程序后台完成,尽量不动用设计器修改重新发布。(对于那些要做产品卖的格友这样的诉求就更明显,虽然目前我做的工程不打算拿出去卖:lol)
   所以这个框架是针对以上特定要求的人使用的,一般情况下用活字格自带的权限框架就ok了。
   
   已经啰嗦了一大堆,下面正式分享:    先讲思路:
   这个问题是初用活字格的时候差不多是1月份的时候在做程序整体架构设计的时候遇到的问题,当时就直接咨询了官方,这是当时发的问题帖子:
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=52986
然后在论坛里面搜到了一个格友也同时遇到了相同的问题:
https://gcdn.grapecity.com.cn/fo ... 80&page=1#pid211509

对设计思路感兴趣的格友通过上面两个帖子基本上可以了解,我就不重新码字了,下面讲一下实现:
延续上面的思路跟胡耀,梁瑞沟通后得到了"获取用户管理角色"的api,为实现提供了基础。因为整个权限体系规划是在功能实现后最后阶段完善的,所以验证了技术可行性和demo测试没问题后就放下了,接下来就是几个月持续的开发工作一直没有时间继续完善这个框架。直到6月份整个程序功能架构搭建完成了,就开始抽空完善这部分权限控制的功能。

下面就按完成后的框架说明现在框架下的设计方法:
1、首先说明,这个权限体系,将活字格原有的”角色“定义为最小”权限“单位即”权限“,分为”菜单类权限“,”模块类权限“,”功能类权限“;
菜单类权限:控制菜单页面是否运行访问使用,每个权限分别跟菜单中的菜单项进行关联,同时跟菜单项设计的页面进行关联;
模块类权限:控制具体模块类页面是否允许使用,每个权限分别跟对应模块的页面进行关联;
功能类权限:控制具体的功能按是否可用,输入栏位是否可输入,业务规则等相关权限,每个权限直接跟对应的按钮,或业务逻辑关联;


这样初步实现权限的松耦合,每个独立的权限只控制自己相关的页面,按钮或功能逻辑。

2、在用户自定义字段中增加”是否角色“字段,新建用户设置”是否角色“为“是”表示该用户为”角色“代替活字格原有的”角色“概念;(为了更方便的按打包好权限的角色快速分配权限给每个操作员)






3、使用"获取用户管理角色"api 实时获取角色列表(权限列表)
附上官方提供的api:

用法可以参考官方给出的说明:
https://gcdn.grapecity.com.cn/fo ... hlight=%BD%C7%C9%AB


工程中可以调用api手动同步角色列表(权限列表)也会每天自动在凌晨1点自动同步;







4、有了权限列表后就可以做很多事情了:
如按角色打包权限:







如按用户分配权限:





里面的核心代码是,用js 删除用户已有权限,然后重新添加新分配的权限:

删除用户已有权限:
var p = Forguncy.Page;
var userName = p.getCell("用户名").getValue();
var oldroles = p.getCell("角色列表").getValue();//原来的角色
var arrOldRoles = oldroles.split(",");

if(oldroles.length!=0)
{
$.each(arrOldRoles, function(i, val){
      Forguncy.deleteUserFromRole(userName, val, function(){
                //alert("角色删除成功");
      },function(error){
                //alert(error);
      })
})
}


p.getCell("执行结果").setValue("完成");


添加新权限:
var p = Forguncy.Page;
var userName = p.getCell("用户名").getValue();
var newroles = p.getCell("角色列表").getValue();//新的的角色
var arrNewRoles = newroles.split(",");


if(newroles .length!=0)
{
$.each(arrNewRoles, function(i, val){
      Forguncy.addUserToRole(userName, val, function(){
                //alert("角色添加成功");
      },function(error){
                //alert(error);
      })
})
}
p.getCell("执行结果").setValue("完成");

4、更进一步,可以给权限列表做一些风格设置,满足不同场景下调用时显示对应的图标,按一定的顺序排序显示等:






5、完成后做了几种不同的显示风格可以在不同的场景下使用:


风格1:



风格2:



风格3:




6、到这里还未结束,整个实现过程存在一个较大的安全问题:
整个架构可以实现权限松耦合,发布后管理权限的目的的。但是安全性存在问题,上面权限管理的核心代码是js所以大家都懂的,只要知道用户名,角色名就可以为所欲为了。

目前只能将权限管理完全独立一个工程,单独给管理人员使用。
而常规工程屏蔽掉可以控制用户角色的js函数。
做法如下:

要在别的工程里面使用屏蔽掉角色管理的js函数,只保留权限管理工程可以使用。

能看到这里的格友都是真爱,点一下题“抛砖引玉”,上面的解决方案基本能满足目前我自己的需要,可能还会存在别的问题是我的盲点没有发现。所以需要格友们帮忙找出来进一步完善。整个设计思路分享出来也是希望活字格能作为参考,后面可以直接集成类似功能到活字格新版中。




本文权限管理模型demo工程:












successit 发表于 2019-8-27 15:40:36

应用系统,尤其是企业内部管理的应用系统,修改频率最高的一是权限(用户权限、表单权限、功能权限等),二是工作流,因为涉及到岗位变动或职务变动,就会涉及这2个方面,格子在这2个方面的功能真的需要做大的改进,不光要开发快速,还要后期方便调整啊。

咖啡里 发表于 2019-8-26 17:03:34

Simon.hu 发表于 2019-8-26 19:13:16

谢谢老铁分享!
这个例子太棒了!!!

djs521720 发表于 2019-8-27 12:42:42

非常不错!谢谢分享!希望官方方面也可以引用下里面的一些想法,把权限工作做的更好!

WangZhiQing 发表于 2019-8-27 22:03:38

帅:lol:lol:lol

Simon.hu 发表于 2019-8-29 18:46:31

10月份的版本会有页面和UI权限的在线配置的:lol

xgh2019 发表于 2019-9-2 14:05:10

这种方式思路牛,问题是把角色当成用户,对于非并发数用户就:L

Simon.hu 发表于 2019-9-3 09:05:53

xgh2019 发表于 2019-9-2 14:05
这种方式思路牛,问题是把角色当成用户,对于非并发数用户就

并发限制的是用户数,又不是限制角色数?
不影响的啊

qtcxc 发表于 2019-9-3 12:19:48

本帖最后由 qtcxc 于 2019-9-3 13:22 编辑

收到反馈,想了一下,其实应该不需要将用户当角色用的,另外做一角色表来存储打包好的角色权限就ok了。小改一下程序就ok了。

脑袋短路了,为什么老想着用用户做角色呢奇怪了。:lol

不过目前暂时不改动了,等官方的新版本看看。
页: [1] 2
查看完整版本: 抛砖引玉--权限管理基础模型