默认情况下Human resources/Common/Workers会列出组织架构内所有公司(法人)内的员工信息,如果我们要只允许用户查看其本公司内部的员工信息该怎么办呢?回答这个问题首先要搞清楚两个关系,一是员工和公司的关系,二是用户和公司的关系。
员工记录在表HcmWoker,这是一个不保存公司信息的表(SaveDataPerCompany=no),也没有专门的字段来保存公司的信息,所以员工和公司是没有直接联系的,员工和公司的关系是在表HcmEmployment中体现,它记录员工和公司的雇佣关系,一个员工可能为多个公司工作,HcmEmployment记录的就是员工在某个公司内工作的起止日期,可以在Human resources/Common/Workers/Employment history中查看到具体的信息,如果一个员工同时为多个公司工作,在打开员工具体信息后Employment页面上是可以选择具体查看哪个公司的信息:
所以我们说“公司内的员工”实际上指的是和当前和公司具有有效雇佣关系的员工。
再来看用户和公司的关系,用户可以有多个角色,这个角色可以是在组织内所有公司有效,也可以是指定到特定的公司,当前登录用户具有访问哪些公司的权限就是靠角色指定的公司来控制的:
注意系统管理员角色是不能指派为某个公司的,它在所有公司内都是有效的。
搞清楚了这两个关系,我们来看看如何来限制用户只能查看可访问公司的员工信息,其实很简单,找到AOT\Security\Policies\HcmWorkerLegalEntity安全策略激活就可以了:
安全策略Extensible data security policy是记录集访问权限的升级,它通过Query过滤出用户能访问的主数据表记录,再根据主表记录过滤出能访问的子表记录。HcmWorkerLegalEntity XDS策略用到的Query是HcmXdsWorkerLegalEntity,可以看到主表就是HcmWorker,与之关联的表是雇佣关系HcmEmployment,它又与MyLegalEntities表关联,MyLegalEntities是个比较特殊的表,表的类型为TempDb临时表,数据库中是不保存数据的,只是在需要用到是通过表上的xds方法填充:
public RefreshFrequency xds(){ CompanyInfo company; MyLegalEntities myLegalEntities; UserDataAreaFilter udaf; SecurityRights rights = SecurityRights::construct(); rights.populateSelectableCompanies(); ttsBegin; delete_from myLegalEntities; insert_recordset myLegalEntities(Name, LanguageId, NameAlias, PartyNumber, LegalEntityID, Tax1099RegNum, UPSNum, Key, BranchId, OrgId, BranchNumber, EnterpriseNumber, IssuingSignature, DataArea) select Name, LanguageId, NameAlias, PartyNumber, RecId, Tax1099RegNum, upsNum, Key, BranchId, OrgId, BranchNumber, EnterpriseNumber, IssuingSignature, DataArea from company join udaf where company.DataArea == udaf.DataArea && udaf.User == curUserId(); ttsCommit; return RefreshFrequency::PerSession;}
它的具体作用时从将当前用户允许访问的公司信息填充到表MyLegalEntities,用户能访问的公司列表记录在表UserDataAreaFilter中,而UserDataAreaFilter内容又是SecurityRights.populateSelectableCompanies()根据我们前面看到的用户角色指派的公司得到的,这样就形成了“用户->公司->雇佣关系->员工”完整的访问限制链条。
系统中使用XDS安全策略地方还很多,比如比较典型的是Global address book的限制访问,Organization administration>Setup>Global address book>Global address book parameters>Security policy options>Secure by legal entity就是通过启用DirRestrictViewPartyInLegalEntity和DirRestrictViewPartyTableInLegalEntity两个XDS安全策略来是实现的。在系统功能中我没有找到通过参数设置来启用HcmWorkerLegalEntity策略的地方,只能是管理员在AOT中手工启用,或许只是我没有找到,有知道的网友请不吝赐教。