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>

See Also

参考

MethodInstance

概念

业务数据目录安全修整程序