【总结帖】关于Cloud功能权限的相关问题
金蝶云社区-GoodSpeed
GoodSpeed
1人赞赏了该文章 12563次浏览 未经作者许可,禁止转载编辑于2013年09月27日 11:25:08

一、总体设计思路:
(1)Cloud的权限 与 cloud的业务单据没有直接联系,它们通过权限框架提供的权限项、权限对象、数据范围关联起来构成cloud业务对象的整个权限控制;
(2)cloud产品没有菜单权限、没有数据权限;
(3)菜单的实质是功能,故菜单权限可以通过功能权限进行反算,所以大家在发布菜单的时候需要绑定权限项,以表示这个菜单验证什么样的功能权限,比如发布的菜单是列表,则一般绑定查看权限项,即没有查看权,则不能看到这个菜单;就像我们去餐馆吃饭,我们不吃辣,则不要把有辣味的菜给我列出来;
(4)数据权限不能独立存在,比如我们在公司不能看(功能权限)电视(范围,数据权限:看电脑,看笔记本),但是回到家则可以看电视,所以数据权限是依赖于不同的场景的,与单据本身有关;数据权限还与功能权限相关:又比如我们能看(功能权限)订单金额为10万以下(数据权限)的单据,但只能审核(功能权限)订单金额为3万以下的单据;
所以,针对订单,在采购订单和销售订单上,我们不但可以设置订单本身的数据范围,还可以设置同一个基础资料的不同范围;
(5)权限对象和权限项的配置和新增,请以管理员身份进入,系统管理节点中;

二、权限配置:

(1)需要为一个订单配置权限,步骤是(boside中):勾选“权限控制”,为其指定一个“权限对象”,即需授权的范围,发布的时候,选择菜单需验证的“权限”;

(2)操作列表,关联权限项,以验证权限,不配置则不验证;

以上配置目前版本不够清晰,在3.0版本我们用一个界面统一管理,并在配置不正确的地方将给与提示;

三、知识点、二次开发等问题:

(1)单据界面上的基础资料的手工录入或者是F8选择,均不验证功能权限,只验证功能权限上配置的数据范围,当然,打开的列表,如果点击它的菜单,则根据它本身的功能权限来控制;
(2)对于帐表,也可以进行数据范围设置,是通过基础资料的范围来控制的;帐表中,加入基础资料列,则在授权的地方能对其进行范围设置;使用的时候,在帐表服务端插件中,sql关联该基础资料范围表即可,不设置范围,则该临时表不会存在;
// Summary:
// 报表数据源参数接口
public interface IRptParams
{
// Summary:
// 基础资料临时表; 如果设置了数据范围,该表会把根据数据范围过滤出来的内码存入临时表;
List BaseDataTempTable { get; set; }

(3)数据范围也是可以自定义的,即可以自己定义一个数据范围界面,开发复杂的条件,自己插件解析;boside中有数据范围服务端插件;需继承抽象类:AbstractDataRuleServicePlugIn

简要示例(声明,以下代码非本人所写!):

namespace Kingdee.K3.HR.ORG.App.Core
{
public class OrgHrDataRuleService : AbstractDataRuleServicePlugIn
{
public override void BeforeAnalyzeDataRule(BOS.Core.Permission.Args.DataRuleArgs e)
{
base.BeforeAnalyzeDataRule(e);
IHrDataRule dataRuleService = HRServiceHelper.GetService();
List fliters = new List();

List permissList = new List();
List forbidList = new List();
foreach (var dataRule in e.DataRules)
{
if (dataRule != null && dataRule.CustomFilterObject != null)
{
if (fliters.Contains(dataRule.Id))
{
continue;
}

DynamicObjectCollection objs = dataRuleService.GetRoleUnitSec(this.Context, dataRule.Id);
if (objs != null && objs.Count > 0)
{
List shemeList = new List();
List myPermissList = new List();
List myForbidList = new List();
Dictionary> headerList = new Dictionary>();
dataRuleService.GetHrFilterList(objs, shemeList, myPermissList, myForbidList, headerList);

permissList.AddRange(myPermissList);
forbidList.AddRange(myForbidList);
}
}
}

string permissStr = "";
if (permissList.Count > 0)
{
permissStr = string.Join(" or ", permissList);
}
string forbidStr = "";
if (permissList.Count > 0)
{
forbidStr = string.Join(" and ", forbidList);
}
string selfCodeFilter = "";
if (permissStr.Length > 0)
{
selfCodeFilter += "(" + permissStr + ")";
}
if (forbidStr.Length > 0)
{
if (selfCodeFilter.Length > 0)
{
selfCodeFilter += " and ";
}
selfCodeFilter += "(" + forbidStr + ")";
}
if (string.IsNullOrEmpty(selfCodeFilter))
{
if (GetIsHRControl())
{
selfCodeFilter = " 0=-1";
}
else
{
selfCodeFilter = "";
}
}
e.Filter = selfCodeFilter;
}

private bool GetIsHRControl()
{
if (this.Context.UserId == OtherConst.AdminId)
{
return false;
}
ICommonService commonService = HRServiceHelper.GetService();
//根据系统参数,控制是否显示
return commonService.GetSystemProfile(this.Context, this.Context.CurrentOrganizationInfo.ID, SystemParams.IsControlByHr, "IsHRControl", false).ConvertTo();
}
}
}

(4)权限服务类为:PermissionServiceHelper,
a,里面包含如何判断某个业务对象在哪个场景下的权限,返回结果中包含在哪些对象中有权限等重要信息;FuncPermissionAuth
b,可以获得某个业务对象在哪个场景下的权限,这些权限是在哪个组织下具有的?GetPermissionOrg(Context ctx, BusinessObject bizObject, string strPerItemId)
c,如何获得数据范围:///


/// 获得列表上,由数据规则解析出来的过滤
///

///
///
///
public static DataRuleFilterObject LoadDataRuleFilter(Context ctx, DataRuleFilterParamenter dataRuleFilterParamenter)

里面还有其他丰富的接口,不在赘述;

四、帖子相关:
(1)求助,二开单据权限配置不生效!
https://vip.kingdee.com/article/285117969884110629

分析:没有弄清楚权限体系,没思考菜单与功能权限的关系;
(2)求权限配置和反写规则的详细说明文档
https://vip.kingdee.com/article/15681

分析:理解以上思想即可,有问题请跟此帖;

(3)【客户】信息中“价目表”开窗中“打开”权限如何控制
https://vip.kingdee.com/article/15541

分析:上面的章节“三、知识点、二次开发等问题”的第一项有解答;

(4)关于权限配制问题
https://vip.kingdee.com/article/285117969011695364
【已解决】权限问题
https://vip.kingdee.com/article/285117969833779025
关于权限配制问题
https://vip.kingdee.com/article/285117969011695364
自己新建的BOS单据,如何配置单据的权限?
https://vip.kingdee.com/article/285117968676151046

分析:以上问题一致,权限配置问题,以上帖子有解答;

(5)行操作权限怎么进行控制?
https://vip.kingdee.com/article/285117969531789177

分析:操作绑定权限项即可;

(6)权限列表
https://vip.kingdee.com/article/285117969481457438
权限报表建议收集
https://vip.kingdee.com/article/15298

分析:收集意见贴,权限的完善需要大家一起来!

(7)权限设置 业务员只能查看自己的单据
https://vip.kingdee.com/article/285117970253209512

分析:数据范围问题,两点:(1)要么自定义数据范围;(2)要么开发自定义变量,关于自定义变量,请参考帖子:待写^_^;

(8)组织间需求但相关权限问题
https://vip.kingdee.com/article/15356

分析:单据上的基础资料权限(仓库),不验证它的功能权限,不限制仓库在本组织或者相关其他组织是否有查看权限,权限由它在这个单上关联的组织隔离控制住;但是,如果设置了这个单上的这个基础资料的数据范围则是另外一回事;

(9)"提交"按钮权限依旧配置不了
https://vip.kingdee.com/article/285117970269986573

分析:详见帖子,与工作流相关;

(10)自己定义"提交"按钮配置不了权限
https://vip.kingdee.com/article/285117969951219554

分析:二次开发完成,插件中自己调用PermissionServiceHelper中的函数验证权限;

(11)自己添加的按钮如何添加到权限列表中去配置权限
https://vip.kingdee.com/article/285117969917665149
自定义按钮,如何在权限对象中进行授权
https://vip.kingdee.com/article/285117969850556288

分析:详见帖子,高级应用,需二次开发,或者配置用空操作等;

(12)【分组权限控制】基础资料的分组增删改权限能否控制?
https://vip.kingdee.com/article/15281

分析:分组权限与右边的明细单据的新增权限一致。分组权限由明细单据的权限来控制;
如果客户反馈问题较多,我们将放出接口,有客户或者配置决定; 待完善!

(13)【二次开发】用户、角色、权限和数据规则的实际应用
https://vip.kingdee.com/article/15250

分析:大虾的分享帖,值得研究!里面包含定义过滤变量。
(14)自己添的的按钮在工作流中的权限问题
https://vip.kingdee.com/article/285117969850556233
分析:二次开发,写插件代码;
(15)【权限】使用心得--2013.08.07更新
https://vip.kingdee.com/article/15243
分析:分享帖,谢谢!

(16)紧急!【数据权限】查看分开了数据权限,但打印时都能看
https://vip.kingdee.com/article/15232
分析:已经修复,打印用查看的数据范围即可;
(17)新增无权限
https://vip.kingdee.com/article/15157
分析:指导解决了!
(18)单据访问权限问题。
https://vip.kingdee.com/article/285117969011695381
分析:配置数据范围即可;

希望以上能给大家带来便利,谢谢!

2014/04/18补充
(1)对于某个角色来说,字段权限与功能权限无关;
如果某个角色没有功能权限的查看权,仍然可以配置这个角色对业务对象上字段的权限,并不会根据功能权限来计算而导致字段无权,两者是隔离的,与其他角色的计算仍然有效;
相关帖子:

https://vip.kingdee.com/article/17315

【已解决】【字段权限】在业务对象无权的情况下的问题和
https://vip.kingdee.com/article/17457

(2)5.0版本中,放开了审核、删除和修改的数据范围设置;以前只是放开了对查看设置数据范围;

(3)5.0版本中,对于共享型基础资料,除查看外,其他场景(比如审核、删除和修改等等)下以使用组织隔离;即有查看某个共享型基础资料的权限,但不一定能删除等;

相关帖子:

【已解决】共享型的物料为什么可以修改
https://vip.kingdee.com/article/17561