【二次开发】用户、角色、权限和数据规则的实际应用
金蝶云社区-springwind_liu
springwind_liu
2人赞赏了该文章 2,527次浏览 未经作者许可,禁止转载编辑于2013年08月07日 19:35:59

最近兄弟们对用户、角色、权限和数据规则有很多探讨,这个我就不参与了,今天这个贴子主要和大家探讨一下原型客户的一些实际应用中的问题及我们给出的解决方案,希望通过此让大家对数据规则有个更加直观的了解:

一、原型客户应用的问题
场景:原型客户二次开发了预算模块,因此扩展了部门基础资料,增加了一个预算部门的标志来确定预算的维度,同时扩展及开发一些财务的单据,如费用报销单,费用报销单上存在预算部门。
问题:客户在应用中发现只要拥有权限的角色可以看到所有的报销单,这权限就放的有点大,客户提出如下需求希望解决这个问题:费用报销单没有按照部门隔离,大家可以看到系统所有报销单,希望能按部门进行隔离(注意:这个要根据用户对应职员的属性(预算部门),去跟单据上的某个字段(预算部门)去比较,不是职员实际所在的部门。)

二、解决方案
对于这个问题我们的标准产品是支持不了的,过滤条件不会有等于当前预算部门的选项,因此,BOS平台提供了支持自定义过滤条件的开放接口来支持此需求,原型客户在此基础上成功实现了此需求。

三、具体的实现逻辑
1、在过滤比较符号集数据表中T_MDL_FILTERCONDITION、T_MDL_FILTERCONDITION_L(多语言)中插入一行记录,后面我们将绑定插入的符号集到字段上;例如,对于过滤变量“当前预算部门”的实现:
--插入配置过滤条件DELETE FROM T_MDL_FILTERCONDITION WHEREFID=1000001;INSERT INTO T_MDL_FILTERCONDITION(FID,FCONDITIONTYPEID,FSEQ,FOPERATE,FINPUTCTLTYPE,FDATASOURCETYPE,FDATAFIELDINDEX,FVALUE,FINPUT,FCLASSNAME) VALUES (1000001, 1000001,1,'=',0,0,0,'ISNULL',0,'HGApp.Core.BuggetDeptFilter.CurrBuggetDeptFilter,HGApp.Core') ;--插入配置过滤条件多语言DELETE FROM T_MDL_FILTERCONDITION_L WHEREFID=1000001;INSERT INTO T_MDL_FILTERCONDITION_L(FPKID,FID,FLOCALEID,FNAME,FDATASOURCE,FTOOLTIP) VALUES (1000001,1000001,2052,N'当前预算部门',null,null) ; 2、然后实现插入语句中代码实现
插件需要继承Kingdee.BOS.Core.CommonFilter.ConditionVariableAnalysis.AbstractVariableAnalysisPlugin变量解析插件抽象基类,并重写基类的GetVariableFilter方法
///

/// 当前用户根据预算部门进行过滤/// [Description("当前用户根据预算部门进行过滤")] public class CurrBuggetDeptFilter :AbstractVariableAnalysisPlugin
{
// 实现
}
示例代码:


3、IDE中打开费用报销单,选中当前预算部门,并添加到右边的配置中,具体如下红色区域所示:

4、数据规则中配置此选项即可

一般来说,使用角色和数据规则可以满足客户需要,只不过有很多过滤不是公共功能,尚未提供而造成配置的复杂性,其实最坏的情况就是一个用户代码一个角色,实际不应该出现的情况。
具体实现文档后续上传。
PS:最近关于角色、用户、权限和数据规则的一些有代表性的贴子
[基础架构]用户授权
https://vip.kingdee.com/article/285117969531789160
[基础架构]【权限】使用心得--2013.08.07更新
https://vip.kingdee.com/article/15243
[使用心得]数据授权的逻辑
https://vip.kingdee.com/article/285117969850556175
[BOS平台]单据访问权限问题。
https://vip.kingdee.com/article/285117969011695381


关键字:用户、角色、权限、授权、数据规则