Ejemplos de AccessChecker
Importante
Para obtener un tutorial completo, consulte Tutorial: uso del Optimizador de seguridad del Catálogo de datos profesionales para restringir los resultados de la búsqueda.
Un método AccessChecker es un método que devuelve los derechos que un usuario tiene en una o más instancias de entidad. Un derecho puede ser un único bit o una colección de bits. Los derechos, una vez determinados, pueden usarse en aplicaciones de datos profesionales a través del método CheckAccess. Por ejemplo, imagine un usuario que genera un elemento web personalizado en el Catálogo de datos profesionales que muestra las tareas de creación, modificación y eliminación de un objeto de metadatos EntityInstance. Al definir un método AccessChecker, el usuario podría llamar a Entity.CheckAccess y, a continuación, habilitar de forma condicional una o varias de las acciones, en función de qué derechos se devuelven.
Las entidades tienen uno o ningún método AccessChecker.
Nota
Si la llamada a Entity.CheckAccess incluye varios identificadores de instancias de entidad, pero la API back-end puede controlar una sola instancia de entidad a la vez, el Catálogo de datos profesionales usará el subprocesamiento múltiple y creará una instancia de tantos subprocesos como sean necesarios para obtener los derechos para todas las instancias de entidad solicitadas. En el siguiente ejemplo de base de datos y en los ejemplos 2 y 3 de servicios web, el Catálogo de datos profesionales usa el subprocesamiento múltiple porque, en estos casos, los métodos back-end sólo toman un único identificador en el parámetro de entrada.
Ejemplo de base de datos
A continuación se muestra un ejemplo sencillo de una instancia de método AccessChecker para un sistema de base de datos. Este ejemplo asume que hay una tabla denominada RightsTable, que tiene las tres columnas siguientes :
CustomerID Identificadores de las instancias de entidad del cliente.
Username Contiene los nombres de usuario.
Rights Representa los derechos que cada usuario representado por Username tiene en la instancia de entidad 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>
Ejemplos de servicio web
A continuación se muestran unos cuantos ejemplos de instancias del método AccessChecker para un sistema de servicio web. En estos ejemplos se asume que hay una entidad denominada Contacts en el sistema de servicio web y que tiene dos identificadores que se definen mediante el siguiente código.
<Identifiers>
<Identifier Name=""id1"" TypeName=""System.String""/>
<Identifier Name=""id2"" TypeName=""System.Int32""/>
</Identifiers>
Observe que hay varias maneras diferentes de modelar el método AccessChecker, en función del diseño de la API back-end del método que devuelve los derechos del usuario.
Ejemplo 1 de servicio web
Este ejemplo supone que la API back-end puede tomar los identificadores para varias instancias de entidad y devolver los derechos que tienen los usuarios en todas esas instancias. Observe que se devuelve una matriz de valores System.Int64[], que el Catálogo de datos profesionales devolverá al método Entity.CheckAccess que realizó la llamada.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
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>
Ejemplo 2 de servicio web
En este ejemplo se supone que la API back-end toma los identificadores para una única instancia de entidad y devuelve los derechos que el usuario tiene en esa instancia. Observe que se devuelve un valor System.Int64, que el Catálogo de datos profesionales devolverá al método Entity.CheckAccess de llamada. En este ejemplo, el Catálogo de datos profesionales usa el subprocesamiento múltiple y crea instancias de tantos subprocesos como sean necesarios para obtener los derechos para todas las instancias de entidad solicitadas en el método Entity.CheckAccess.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
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>
Ejemplo 3 de servicio web
En este ejemplo se supone que la API back-end toma los identificadores para una única instancia de entidad y devuelve los derechos que el usuario tiene en esa instancia. Observe que el método back-end devuelve una matriz System.Int64[]. El Catálogo de datos profesionales la devolverá al método Entity.CheckAccess de llamada. En este ejemplo, el Catálogo de datos profesionales usa el subprocesamiento múltiple y crea instancias de tantos subprocesos como sean necesarios para obtener los derechos para todas las instancias de entidad solicitadas en el método Entity.CheckAccess.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
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>
Ejemplo 4 de servicio web
Este ejemplo supone que la API back-end puede tomar los identificadores para varias instancias de entidad y devolver los derechos que tienen los usuarios en todas esas instancias. Observe que se devuelve una matriz de valores System.Int64[], que el Catálogo de datos profesionales devolverá al método Entity.CheckAccess que realizó la llamada.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
public System.Int64[] CheckUserAccess4(YourCompany.CustomTypes.IdCase4a[] in1, YourCompany.CustomTypes.IdCase4b[] in2)
A continuación se muestra la apariencia que podrían tener los tipos personalizados usados en este ejemplo:
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>
Ejemplo 5 de servicio web
Este ejemplo supone que la API back-end puede tomar los identificadores para varias instancias de entidad y devolver los derechos que tienen los usuarios en todas esas instancias. Observe que se devuelve una matriz de valores System.Int32[], que a su vez el Catálogo de datos profesionales convertirá en long[] antes de devolverla al método Entity.CheckAccess.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
public System.Int32 [] CheckUserAccess5(System.String[] in1, System.Int32[] in2)
A continuación se muestra la apariencia que podrían tener los tipos personalizados usados en este ejemplo:
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>
Ejemplo 6 de servicio web
Este ejemplo supone que la API back-end puede tomar los identificadores para varias instancias de entidad y devolver los derechos que tienen los usuarios en todas esas instancias. Observe que se devuelve una matriz de valores System.Int32[], que a su vez el Catálogo de datos profesionales convertirá en long[] antes de devolverla al método Entity.CheckAccess.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
public YourCompany.CustomTypes.ReturnContainer CheckUserAccess6(YourCompany.CustomTypes.IdContainer in1)
Éste es el aspecto que tendrán los tipos personalizados usados en este ejemplo:
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>
Ejemplo 7 de servicio web
Este ejemplo supone que la API back-end puede tomar los identificadores para varias instancias de entidad y devolver los derechos que tienen los usuarios en todas esas instancias. Observe que se devuelve una matriz de valores System.Int64[], que el Catálogo de datos profesionales devolverá al método Entity.CheckAccess que realizó la llamada.
A continuación se muestra la apariencia que podría tener el método público back-end para este ejemplo:
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>
Vea también
Otros recursos
MethodInstance
Optimizador de seguridad del Catálogo de datos profesionales