AccessChecker サンプル
重要
完全なチュートリアルについては、「[ウォークスルー] ビジネス データ カタログのセキュリティ トリマを使用して検索結果をトリミングする」を参照してください。
AccessChecker は、ユーザーが 1 つ以上のエンティティ インスタンスに対して持っている権限を返すメソッドです。権限は、単一のビットまたはビットの集まりです。決定された権限は、CheckAccess メソッド経由でビジネス データ クライアント アプリケーションから使用できます。たとえば、ユーザーが EntityInstance メタデータ オブジェクトに対する作成、編集、および削除操作を表示するカスタム Web パーツをビジネス データ カタログで構築するとします。AccessChecker メソッドを定義することで、ユーザーは Entity.CheckAccess を呼び出し、返される権限に従って、1 つ以上の操作を条件付きで有効にすることができます。
エンティティには、0 個以上の AccessChecker メソッドがあります。
注意
Entity.CheckAccess の呼び出しに複数のエンティティ インスタンス ID が含まれているが、バックエンド サーバー API はエンティティ インスタンスを一度に 1 つしか処理できない場合、ビジネス データ カタログは自動的にマルチスレッドを使用して、要求されたすべてのエンティティ インスタンスに対する権限を取得するために必要な数だけスレッドをインスタンス化します。以下のデータベースの例と Web サービスの例 2 および 3 では、バックエンド メソッドが入力パラメータで ID を 1 つしか受け取らないため、ビジネスデータ カタログによってマルチスレッドが使用されます。
データベースの例
以下は、データベース システム用の AccessChecker メソッド インスタンスの簡単な例です。この例は、次の 3 つの列を持つ、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 というエンティティがあり、次のコードで定義されている 2 つの識別子を持っていることを前提としています。
<Identifiers>
<Identifier Name=""id1"" TypeName=""System.String""/>
<Identifier Name=""id2"" TypeName=""System.Int32""/>
</Identifiers>
ユーザーの権限を返すメソッドのバックエンド API 設計によっては、AccessChecker メソッドをモデリングする方法が複数あることに注意してください。
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[] が返され、ビジネス データ カタログはそれを Entity.CheckAccess メソッドに返す前に、long[] に変換します。
この例のバックエンド パブリック メソッドは次のようになります。
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[] が返され、ビジネス データ カタログはそれを Entity.CheckAccess メソッドに返す前に、long[] に変換します。
この例のバックエンド パブリック メソッドは次のようになります。
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>