AccessChecker 示例
重要
有关完整的演练,请参阅演练:使用业务数据目录安全修整程序修整搜索结果。
AccessChecker 是一种方法,可返回用户对一个或多个实体实例具有的权限。权限可以是一种权限或多种权限组合。一经确定,业务数据客户端应用程序便可通过 CheckAccess 方法使用权限。例如,假设用户在业务数据目录上生成了一个自定义 Web 部件,为某个 EntityInstance 元数据对象显示创建、编辑和删除操作。通过定义 AccessChecker 方法,用户可以调用 Entity.CheckAccess,然后根据返回的权限有条件地启用一项或多项操作。
实体可具有零个或多个 AccessChecker 方法。
备注
如果对 Entity.CheckAccess 的调用包括多个实体实例 ID,但后端服务器 API 一次只能处理一个实体实例,业务数据目录将自动采用多线程处理,并根据需要实例化多个线程,以获取所有请求的实体实例的权限。在下面的数据库示例和 Web 服务示例 2 和 3 中,由于后端方法只使用输入参数中的一个 ID,所以业务数据目录采用了多线程处理。
数据库示例
以下是数据库系统的 AccessChecker 方法实例的简单示例。该示例假定您有一个名为“RightsTable”的表,该表具有以下三列:
CustomerId 客户实体实例的 ID
Username 存放用户名。
Rights 表示 Username 所指的每位用户对 Customer 实体实例拥有的权限。
<Method Name="UserRightsForCustomer">
<Properties>
<Property Name="RdbCommandText" Type="System.String">
SELECT CAST(Rights as bigint)
FROM Customers
WHERE
CustomerId = @CustomerId and UserName = @currentuser;
</Property>
<Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
</Properties>
<FilterDescriptors>
<FilterDescriptor Type="UserContext" Name="currentuser" />
</FilterDescriptors>
<Parameters>
<Parameter Direction="In" Name="@CustomerId">
<TypeDescriptor TypeName="System.String" IdentifierName="CustomerId" Name="CustomerId" />
</Parameter>
<Parameter Direction="In" Name="@currentuser">
<TypeDescriptor TypeName="System.String" AssociatedFilter="currentuser" Name="currentuser" />
</Parameter>
<Parameter Direction="Return" Name="RightsForUser">
<TypeDescriptor TypeName="System.Data.SqlClient.SqlDataReader, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="AccessCheckDataReader">
<TypeDescriptors>
<TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="AccessCheckRecord">
<TypeDescriptors>
<TypeDescriptor TypeName="System.Int64" Name="Rights" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Type="AccessChecker" ReturnParameterName="RightsForUser" ReturnTypeDescriptorName="Rights" ReturnTypeDescriptorLevel="2" Name="UserRightsForCustomer" />
</MethodInstances>
</Method>
Web 服务示例
以下是 Web 服务系统的 AccessChecker 方法实例的几个示例。这些示例假定您在 Web 服务系统中拥有一个名为“Contacts”的实体,该实体有两个标识符,具体如以下代码所示。
<Identifiers>
<Identifier Name=""id1"" TypeName=""System.String""/>
<Identifier Name=""id2"" TypeName=""System.Int32""/>
</Identifiers>
请注意,您可以通过几种不同方法对 AccessChecker 方法进行建模,具体取决于返回用户权限的方法的后端 API 设计。
Web 服务示例 1
本示例假定后端 API 可使用多个实体实例的 ID 并返回用户对所有这些实例拥有的权限。请注意,此时返回的是一个 System.Int64[] 值的数组,业务数据目录会将该数组返回调用的 Entity.CheckAccess 方法。
以下显示该示例的后端公共方法:
public System.Int64 CheckUserAccess1(System.Object[] in, System.String in2)
<Method Name="CheckUserAccess1">
<FilterDescriptors>
<FilterDescriptor Name="fd" Type="UserContext"/>
</FilterDescriptors>
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in" TypeName="System.Object[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName=" + typeof(IdCase1).AssemblyQualifiedName + @" >
<TypeDescriptors>
<TypeDescriptor Name="Id1" TypeName="System.String" IdentifierName="id1"/>
<TypeDescriptor Name="Id2" TypeName="System.Int32" IdentifierName="id2"/>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="in2" Direction="In" >
<TypeDescriptor Name="in" TypeName="System.String" AssociatedFilter="fd">
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int64[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int64" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess1" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item" />
</MethodInstances>
</Method>
Web 服务示例 2
本示例假定后端 API 使用单个实体实例的 ID 并返回用户对该实例拥有的权限。请注意,此时返回的是一个 System.Int64 值,业务数据目录会将该值返回调用的 Entity.CheckAccess 方法。在此示例中,业务数据目录使用多线程处理,并根据需要实例化多个线程,以获取 Entity.CheckAccess 方法中请求的所有实体实例的权限。
以下显示该示例的后端公共方法:
public System.Int64 CheckUserAccess2(System.Int32 in1, System.Int32 in2)
<Method Name="CheckUserAccess2">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in1" TypeName="System.String" IdentifierName="id1">
</TypeDescriptor>
</Parameter>
<Parameter Name="in2" Direction="In" >
<TypeDescriptor Name="in2" TypeName="System.Int32" IdentifierName="id2">
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int64">
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess2" Type="AccessChecker" ReturnParameterName="out" />
</MethodInstances>
</Method>
Web 服务示例 3
本示例假定后端 API 使用单个实体实例的 ID 并返回用户对该实例拥有的权限。请注意,后端方法返回的是一个 System.Int64[] 数组。业务数据目录会将其返回调用的 Entity.CheckAccess 方法。在此示例中,业务数据目录使用多线程处理,并根据需要实例化多个线程,以获取 Entity.CheckAccess 方法中请求的所有实体实例的权限。
以下显示该示例的后端公共方法:
public System.Int64[] CheckUserAccess3(System.String in1, System.Int32 in2)
<Method Name="CheckUserAccess3">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in1" TypeName="System.String" IdentifierName="id1">
</TypeDescriptor>
</Parameter>
<Parameter Name="in2" Direction="In" >
<TypeDescriptor Name="in2" TypeName="System.Int32" IdentifierName="id2">
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int64[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int64" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess3" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item"/>
</MethodInstances>
</Method>
Web 服务示例 4
本示例假定后端 API 可使用多个实体实例的 ID 并返回用户对所有这些实例拥有的权限。请注意,此时返回的是一个 System.Int64[] 值的数组,业务数据目录会将该数组返回调用的 Entity.CheckAccess 方法。
以下显示该示例的后端公共方法:
public System.Int64[] CheckUserAccess4(YourCompany.CustomTypes.IdCase4a[] in1, YourCompany.CustomTypes.IdCase4b[] in2)
以下显示该示例中使用的自定义类型:
class IdCase4a
{
public System.String Id1;
}
class IdCase4b
{
public System.String Id2;
}
<Method Name="CheckUserAccess4">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in1" TypeName="YourCompany.CustomTypes.IdCase4a[], + typeof(IdCase4a).Assembly.FullName + @""" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName=" + typeof(IdCase4a).AssemblyQualifiedName + @" >
<TypeDescriptors>
<TypeDescriptor Name="Id1" TypeName="System.String" IdentifierName="id1"/>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="in2" Direction="In" >
<TypeDescriptor Name="in2" TypeName="YourCompany.CustomTypes.IdCase4b[], + typeof(IdCase4b).Assembly.FullName + @""" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName=" + typeof(IdCase4b).AssemblyQualifiedName + @" >
<TypeDescriptors>
<TypeDescriptor Name="Id2" TypeName="System.Int32" IdentifierName="id2"/>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int64[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int64" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess4" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item" />
</MethodInstances>
</Method>
Web 服务示例 5
该示例假定后端 API 可使用多个实体实例的 ID 并返回用户对所有这些实例拥有的权限。请注意,此时返回的是一个 System.Int32[] 值数组,业务数据目录会将其转换为 long[],然后返回给 Entity.CheckAccess 方法。
以下显示该示例的后端公共方法:
public System.Int32 [] CheckUserAccess5(System.String[] in1, System.Int32[] in2)
以下显示该示例中使用的自定义类型:
class IdCase4a
{
public System.String Id1;
}
class IdCase4b
{
public System.String Id2;
}
<Method Name="CheckUserAccess5">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in1" TypeName="System.String[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="Id1" TypeName="System.String" IdentifierName="id1"/>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="in2" Direction="In" >
<TypeDescriptor Name="in2" TypeName="System.Int32[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="Id2" TypeName="System.Int32" IdentifierName="id2"/>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int32 []" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int32" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess5" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item" />
</MethodInstances>
</Method>
Web 服务示例 6
该示例假定后端 API 可使用多个实体实例的 ID 并返回用户对所有这些实例拥有的权限。请注意,此时返回的是一个 System.Int32[] 值数组,业务数据目录会将其转换为 long[],然后返回给 Entity.CheckAccess 方法。
以下显示该示例的后端公共方法:
public YourCompany.CustomTypes.ReturnContainer CheckUserAccess6(YourCompany.CustomTypes.IdContainer in1)
以下显示该示例中使用的自定义类型:
class IdContainer
{
public YourCompany.CustomTypes.IdCase6[] ids;
}
class IdCase6
{
public YourCompany.CustomTypes.IdCase1item;
}
class IdCase1
{
public System.String Id1;
public System.Int32 Id2;
}
class ReturnContainer
{
public System.Int32[] ints;
}
<Method Name="CheckUserAccess6">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in1" TypeName="YourCompany.CustomTypes.IdContainer, + typeof(IdCase4a).Assembly.FullName + @""" >
<TypeDescriptors>
<TypeDescriptor Name="ids" TypeName="YourCompany.CustomTypes.IdCase6[], + typeof(IdCase1).Assembly.FullName + @""" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName=" + typeof(IdCase1).AssemblyQualifiedName + @" >
<TypeDescriptors>
<TypeDescriptor Name="Id1" TypeName="System.String" IdentifierName="id1"/>
<TypeDescriptor Name="Id2" TypeName="System.Int32" IdentifierName="id2"/>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName=" + typeof(ReturnContainer).AssemblyQualifiedName + @" >
<TypeDescriptors>
<TypeDescriptor Name="ints" TypeName="System.Int32[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int32" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess6" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item" />
</MethodInstances>
</Method>
Web 服务示例 7
本示例假定后端 API 可使用多个实体实例的 ID 并返回用户对所有这些实例拥有的权限。请注意,此时返回的是一个 System.Int64[] 值的数组,业务数据目录会将该数组返回调用的 Entity.CheckAccess 方法。
以下显示该示例的后端公共方法:
public System.Int64[] CheckUserAccess7(System.Object[] in)
<Method Name="CheckUserAccess7">
<Parameters>
<Parameter Name="in" Direction="In" >
<TypeDescriptor Name="in" TypeName="System.Object[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Object[]" >
<TypeDescriptors>
<TypeDescriptor Name="Id1" TypeName="System.String" IdentifierName="id1"/>
<TypeDescriptor Name="Id2" TypeName="System.Int32" IdentifierName="id2"/>
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
<Parameter Name="out" Direction="Return" >
<TypeDescriptor Name="out" TypeName="System.Int64[]" IsCollection="true">
<TypeDescriptors>
<TypeDescriptor Name="item" TypeName="System.Int64" />
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>
<MethodInstances>
<MethodInstance Name="CheckUserAccess7" Type="AccessChecker" ReturnParameterName="out" ReturnTypeDescriptorName="item" />
</MethodInstances>
</Method>