Share via


AccessChecker, exemples

Un AccessChecker est une méthode qui retourne les droits qu'un utilisateur détient sur une ou plusieurs instances d'entité. Un droit peut être un seul bit ou une collection de bits. Les droits, une fois déterminés, sont utilisables par des applications clientes de données métiers via la méthode CheckAccess. Prenez par exemple un utilisateur générant un composant WebPart personnalisé sur le catalogue de données métiers qui affiche les actions Créer, Modifier et Supprimer pour un objet de métadonnées EntityInstance. En définissant une méthode AccessChecker, l'utilisateur peut appeler Entity.CheckAccess, puis activer de façon conditionnelle une ou plusieurs des actions, en fonction des droits retournés.

Les entités ont zéro ou plusieurs méthodes AccessChecker.

Notes

Si l'appel à Entity.CheckAccess comprend plusieurs ID d'instance d'entité, alors que l'API du serveur principal ne peut gérer qu'une seule instance d'entité à la fois, le catalogue de données métiers utilise automatiquement le multithreading et instancie autant de threads que nécessaire pour obtenir les droits pour toutes les instances d'entité demandées. Dans l'exemple de base de données suivant et dans les exemples de service Web 2 et 3, le multithreading est utilisé par le catalogue de données métiers car, dans ce cas, les méthodes principales ne prennent qu'un ID dans le paramètre d'entrée.

Exemple de base de données

Voici un exemple simple d'une instance de méthode AccessChecker pour un système de base de données. Cet exemple suppose que vous avez une table nommée RightsTable, qui a les trois colonnes suivantes:

  • CustomerID     ID des instances d'entité client

  • Username   Contient les noms d'utilisateurs.

  • Les droits    Représente les droits dont dispose chaque utilisateur représenté par Username sur l'instance d'entité 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>

Exemples de service Web

Voici quelques exemples illustrant les instances de la méthode AccessChecker pour un système de service Web. Ces exemples supposent que vous disposez d'une entité nommée Contacts dans votre système de service Web et qu'elle a deux identificateurs tel que défini dans le code suivant.

    <Identifiers>
       <Identifier Name=""id1"" TypeName=""System.String""/>
       <Identifier Name=""id2"" TypeName=""System.Int32""/>
    </Identifiers>

Notez qu'il existe différentes manières de modéliser votre méthode AccessChecker, selon la conception de l'API principale de la méthode qui retourne les droits de l'utilisateur.

Exemple de service Web 1

Cet exemple part du principe que l'API principale peut prendre les ID de plusieurs instances d'entité et retourner les droits dont l'utilisateur dispose sur tous ces instances. Notez qu'un tableau System.Int64[] de valeurs est retourné, que le catalogue de données métiers retournera à la méthode Entity.CheckAccess d'appel.

Voici comment peut se présenter la méthode publique principale pour cet exemple :

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>

Exemple de service Web 2

Cet exemple part du principe que l'API principale prend les ID d'une instance d'entité unique et retourne les droits dont l'utilisateur dispose sur cette instance. Notez que la valeur System.Int64 est retournée, que le catalogue de données métiers retournera à la méthode Entity.CheckAccess d'appel. Dans cet exemple, le catalogue de données métiers utilise le multithreading et instancie autant de threads que nécessaire pour obtenir les droits pour toutes les instances d'entité demandées dans la méthode Entity.CheckAccess.

Voici comment pourrait se présenter la méthode publique principale pour cet exemple :

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>

Exemple de service Web 3

Cet exemple part du principe que l'API principale prend les ID d'une instance d'entité unique et retourne les droits dont l'utilisateur dispose sur cette instance. Notez qu'un tableau System.Int64[] est retourné par la méthode principale. Le catalogue de données métiers le renvoie à la méthode d'appel Entity.CheckAccess. Dans cet exemple, le catalogue de données métiers utilise le multithreading et instancie autant de threads que nécessaire pour obtenir les droits pour toutes les instances d'entité demandées dans la méthode Entity.CheckAccess.

Voici comment la méthode publique principale peut se présenter pour cet exemple :

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>

Exemple de service Web 4

Cet exemple part du principe que l'API principale peut prendre les ID pour plusieurs instances d'entité et retourner les droits dont l'utilisateur dispose sur tous ces instances. Notez qu'un tableau System.Int64[] de valeurs est retourné, que le catalogue de données métiers retournera à la méthode Entity.CheckAccess d'appel.

Voici comment la méthode publique principale pourrait se présenter pour cet exemple :

public System.Int64[] CheckUserAccess4(YourCompany.CustomTypes.IdCase4a[] in1, YourCompany.CustomTypes.IdCase4b[] in2)

Voici comment les types personnalisés utilisés dans cet exemple pourraient se présenter :

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>

Exemple de service Web 5

Cet exemple part du principe que l'API principale peut prendre les ID de plusieurs instances d'entité et retourner les droits dont l'utilisateur dispose sur toutes ces instances. Notez qu'un tableau de valeurs System.Int32[] est retourné, que le catalogue de données métiers va convertir en long[] avant de la retourner à la méthode Entity.CheckAccess.

Voici comment la méthode publique principale pourrait se présenter pour cet exemple :

public System.Int32 [] CheckUserAccess5(System.String[] in1, System.Int32[] in2)

Voici comment les types personnalisés utilisés dans cet exemple pourraient se présenter :

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>

Exemple de service Web 6

Cet exemple part du principe que l'API principale peut prendre les ID pour plusieurs instances d'entité et retourner les droits dont l'utilisateur dispose sur toutes ces instances. Notez qu'un tableau de valeurs System.Int32[] est retourné, que le catalogue de données métiers va convertir en long[] avant de la retourner à la méthode Entity.CheckAccess.

Voici comment la méthode publique principale pourrait se présenter pour cet exemple :

public YourCompany.CustomTypes.ReturnContainer CheckUserAccess6(YourCompany.CustomTypes.IdContainer in1)

Voici comment pourraient se présenter les types personnalisés dans cet exemple :

class IdContainer

{

public YourCompany.CustomTypes.IdCase6[] ids;

}

class IdCase6

{

public YourCompany.CustomTypes.IdCase1 item;

}

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> 

Exemple de service Web 7

Cet exemple part du principe que l'API principale peut prendre les ID de plusieurs instances d'entité et retourner les droits dont l'utilisateur dispose sur tous ces instances. Notez qu'un tableau System.Int64[] de valeurs est retourné, que le catalogue de données métiers retournera à la méthode Entity.CheckAccess d'appel.

Voici comment la méthode publique principale pourrait se présenter pour cet exemple :

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>

Voir aussi

Autres ressources

MethodInstance
Filtrage de sécurité du catalogue de données métiers