Epicor页面根据不同权限显示不同的表格列
需求
一个查询报表中设计金额的列要设置一个单独权限,控制有权限的用户才能查看金额列,否则隐藏,,报表是用客制化+BAQ实现的
权限实现
权限判断
通过Epicor内置的权限配置,新增一个菜单权限值。规则如下[menuTag]_[数字]
后面的_数字需要为2的幂。后续可通过 value & 2 == 2 来判断用户是否拥有权限值2

自定义权限获取函数:ZUserSecurity.GetAuthorizeValue

C# 全选
// 获得权限集合
var secListSource = Db.Security.Where(w=>(String.IsNullOrEmpty(w.Company) || w.Company == this.callContextClient.CurrentCompany) && w.SecCode.StartsWith(this.MenuTag+"_")).ToList();
// 解析权限数据
var secList = secListSource.Select(s=>new {
s.SecCode,
AuthorizeValue = s.SecCode.Substring(s.SecCode.LastIndexOf("_")+1),
EntryList = s.EntryList.Split(","),
NoEntryList = s.NoEntryList.Split(","),
s.SecurityMgr
}).ToList();
// 获得用户信息,包含角色,是否为全年管理员
var useInfoSource = Db.SysUserFile.Where(w=>w.UserID==this.callContextClient.CurrentUserId).Select(s=>new {
s.UserID,
s.SecurityMgr,
s.GroupList
}).First();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
var userIsSecurityMgr = useInfoSource.SecurityMgr;
// 用户角色集合
var userGroupList = useInfoSource.GroupList.Split("~").ToList();
// 计算权限值
int value = 0;
foreach(var sec in secList) {
sb.AppendLine($"seccode={sec.SecCode};value={sec.AuthorizeValue}");
if(!int.TryParse(sec.AuthorizeValue,out var _val))
continue;
// 需要权限管理员
if(sec.SecurityMgr) {
// 用户是否为权限管理与
if(userIsSecurityMgr){
sb.AppendLine($"权限管理员,增加权限:{_val}");
value = value | _val;
}
continue;
}
// 用户为权限管理员
if(userIsSecurityMgr) {
sb.AppendLine($"权限管理员,增加权限:{_val}");
value = value | _val;
continue;
}
// 如果默认是allow,判断是否有dis的权限
if(sec.EntryList.Contains("*")) {
if(sec.NoEntryList.Intersect(userGroupList).Count() > 0){
// 存在dis的配置,没有权限
continue;
}
sb.AppendLine($"默认是allow,没有dis,增加权限:{_val}");
value = value | _val;
continue;
}
// 如果其他啊,有allow就代表有
else {
if(sec.EntryList.Intersect(userGroupList).Count() > 0) {
var str1 = String.Join(",",userGroupList);
var str2 = String.Join(",",sec.EntryList);
sb.AppendLine($"默认是非allow,存在allow,增加权限:{_val},SecEntryList={str2},userGroupList={str1}");
value = value | _val;
}
continue;
}
}
this.AuthorizeValue = value;
sb.AppendLine($"company={ this.callContextClient.CurrentCompany }");
sb.Append($"currentID={ this.callContextClient.CurrentUserId }");
this.Message = sb.ToString();
返回如下:

同时支持多个权限,通过 value & 2 == 2来判断是否拥有某个权限
根据权限隐藏grid中的列
因为界面获取到权限后,要根据权限来隐藏grid中的列。因此如果在onload中,由于grid还没有渲染,对grid列的操作可能会失效的。因此需要在grid的create事件中实现

事件触发方式

kinetic-function设置如下:

row-update设置如下:

权限判断

如通没有权限,就隐藏指定列

第一个property-set是设置grid的guid,避免因为grid用户个性化列的设置引起列冲突,
用户自定义的表格个性化配置可在sql中查询。key3为表格的guid
SQL 全选
select top 200 * from [Ice].[XXXDef] where key3 = 'd93c7f28-778d-4d66-8b2b-fabf7b2c1fc1'
第二个property-set是设置需要隐藏的列

其实就是设置表格的gridModel.columnsHidden属性
最后调用grid-schema-invalidate

配合规则使用效果更佳:

添加规则后,如果用户强行把隐藏列给显示出来,界面上这些列会强制显示一篇看空白的。比如

但是这个并不会影响后台返回的数据,后台返回数据还是完整的返回

因此可能存在数据泄密风险,所以我们可以写两个不同权限的BAQ,通过不同BAQ来达到后台返回数据不同

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
epicor 张国生


