Acumatica中自定义按分支限制客户访问的方案咨询
基于DAC属性实现Acumatica客户的分支+角色访问限制
是的,通过在客户DAC(BCCustomer)上添加自定义属性结合业务逻辑,完全可以实现仅针对客户的分支+角色访问限制,避开内置功能对仓库的连带限制。以下是具体实现步骤:
1. 扩展客户DAC添加分支关联字段
如果系统内客户还没有和分支直接关联的字段,先扩展BCCustomer DAC添加分支引用字段:
public class BCCustomerExt : PXCacheExtension<BCCustomer> { #region BranchID [PXInt] [PXUIField(DisplayName = "Restricted Branch")] [PXSelector(typeof(Search<Branch.branchID>), typeof(Branch.branchCD), typeof(Branch.branchName))] public virtual int? BranchID { get; set; } public abstract class branchID : PX.Data.BQL.BqlInt.Field<branchID> { } #endregion }
这个字段用于标记该客户归属的限制分支。
2. 自定义访问限制属性
创建一个继承自PXRestrictorAttribute的自定义属性,实现基于当前用户角色和分支的过滤逻辑:
public class CustomerBranchRestrictorAttribute : PXRestrictorAttribute { public CustomerBranchRestrictorAttribute(Type message) : base(message, typeof(Where<BCCustomerExt.branchID, Equal<Current<AccessInfo.branchID>>, Or<BCCustomerExt.branchID, IsNull>>)) { // 额外添加管理员角色豁免逻辑 this.Attributes.Add(new PXRestrictorAttribute(message, typeof(Where<Current<AccessInfo.roleID>, In<Select<Role.roleID, Where<Role.isAdmin, Equal<True>>>>>))); } }
这里的逻辑是:仅允许当前分支匹配客户限制分支(或客户无限制分支)的用户访问,同时管理员角色不受限制。
3. 将属性应用到客户DAC的主键字段
在BCCustomer DAC的主键字段(CustomerID)上添加自定义属性。如果是通过扩展方式实现,代码如下:
public class BCCustomerExt : PXCacheExtension<BCCustomer> { #region CustomerID [PXDBString(15, IsKey = true, IsUnicode = true, InputMask = ">CCCCCCCCCCCCCCC")] [PXUIField(DisplayName = "Customer ID", Visibility = PXUIVisibility.SelectorVisible)] [CustomerBranchRestrictor(typeof(ErrorMessages.accessDenied))] public virtual string CustomerID { get; set; } public abstract class customerID : PX.Data.BQL.BqlString.Field<customerID> { } #endregion }
4. 配置角色的分支权限
在Acumatica系统的角色管理中,给目标角色分配对应分支的访问权限,确保用户所属角色仅能访问指定分支,配合自定义属性实现双重校验。
关键注意事项
- 若需要一个角色对应多个分支的灵活映射,可创建自定义DAC存储角色与分支的关联关系,在自定义属性中查询该表进行过滤。
- 测试时切换不同角色和分支的用户账号,验证客户列表仅显示允许访问的条目,且仓库访问不受影响。
- 确保自定义属性的过滤逻辑不会影响依赖客户数据的报表或业务流程,必要时补充更多角色豁免规则。
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

