EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

合并以不同角色定义的权限

您可以配置角色的权限并将其分配给用户。本主题描述当用户具有多个角色时,安全系统如何处理权限。

一般信息

一个角色的权限不会影响另一个角色的权限。当用户具有多个角色时,安全系统会一致地检查每个角色的权限。安全系统根据SecurityStrategy.RolesMergingMode属性值合并这些检查的结果。下表列出了可用的模式:

角色合并模式 描述
在任何角色中都被授予 当用户角色中的至少一个允许该操作时,用户可以执行该操作。这是默认模式。
授予所有角色 当分配给该用户的所有角色都允许该操作时,该用户可以执行该操作。

例如,您的应用程序包括“客户”和“订单”业务对象。用户具有具有DenyAllByDefault权限策略的CustomersManagerOrdersManager角色。角色CustomerManager具有允许读取Customer对象的权限。角色OrdersManager具有允许读取Order对象的权限。安全系统根据RolesMergingMode属性值处理这些权限:

  • GrantedInAnyRole模式

    用户可以读取两种类型。在CustomerManager角色中删除对Customer类型的读取权限,以拒绝读取此类型的对象。

  • GrantedInAllRoles模式

    用户无法读取两种类型。在OrdersManager角色中为Customer类型添加读取权限,以允许读取此类型的对象。

关联权限合并

本节介绍当用户具有多个分配的角色时,安全系统如何合并关联对象的权限。

注意

您应该在一个角色中为两个关联方设置权限。

例如,“订单”和“客户”业务对象具有一对多关系。该客户对象实现了订单集合属性和订单对象实现了客户参考属性。

public class Customer : BaseObject {
    // ...
    [Association]
    public XPCollection<Order> Orders { 
        get { return GetCollection<Order>(nameof(Orders)); }
    }
}

public class Order : BaseObject {
    // ...
    [Association]
    public Customer Customer {
        get { return fCustomer; }
        set { SetPropertyValue(nameof(Customer), ref fCustomer, value); }
    }
    Customer fCustomer;

}

用户具有“ A”和“ B”角色,并且SecurityStrategy.RolesMergingMode属性设置为GrantedInAnyRole。要允许访问Order.Customer属性并拒绝Customer.Orders集合,请按照以下步骤操作:

  1. 向角色“ A”授予允许用户读取/写入Order.Customer属性的权限。
  2. 向角色“ B”授予拒绝用户读取/写入Customer.Orders集合的权限。

用户可以读取/写入“ Orders-Customer”关联,因为角色“ A”允许根据“关联对象的权限”一文中描述的规则进行这些操作。请注意,角色“ B”拒绝关联,但是当RolesMergingMode属性设置为GrantedInAnyRole时,安全系统不会将其考虑在内。

如果您授予允许用户以一个角色读取/写入Order.Customer属性并拒绝Customer.Orders集合的权限,则该用户无法读取/写入“ Orders-Customer”关联,因为该关联在客户端被拒绝。

引用属性的权限合并

本节介绍当用户具有多个分配的角色时,安全系统如何合并参考属性的权限。

注意

您应该在一个角色内设置引用属性和引用类型

例如,“订单”业务对象具有“客户类型”客户参考属性。

public class Order : BaseObject {
    // ...   
    public Customer Customer {
        get { return fCustomer; }
        set { SetPropertyValue(nameof(Customer), ref fCustomer, value); }
    }
    Customer fCustomer;

}

在以下情况下,用户无法读取Order.Customer属性:

  • 角色“ A”具有允许用户读取Order.Customer属性的权限
  • 角色“ B”具有允许用户读取“客户”类型的权限

这些权限具有不同的角色,并且不会互相影响。在一个角色中添加对Order.Customer属性和Customer类型的读取权限,以允许用户读取此属性。

转载保留此链接,注明出处