Limitar la funcionalidad de modificación de datos basada en el usuario (VB)

por Scott Mitchell

Descargar PDF

En una aplicación web que permite a los usuarios editar datos, es posible que diferentes cuentas de usuario tengan privilegios de edición de datos diferentes. En este tutorial se examinará cómo ajustar dinámicamente las funcionalidades de modificación de datos en función del usuario visitante.

Introducción

Una serie de aplicaciones web admiten cuentas de usuario y proporcionan diferentes opciones, informes y funcionalidades en función del usuario que ha iniciado sesión. Por ejemplo, con nuestros tutoriales podríamos permitir que los usuarios de las empresas proveedoras inicien sesión en el sitio y actualicen información general sobre sus productos (por ejemplo, su nombre y cantidad por unidad), junto con la información de proveedor, como el nombre de la empresa, la dirección, la información de la persona de contacto, etc. Además, es posible que queramos incluir algunas cuentas de usuario para personas de nuestra empresa para que puedan iniciar sesión y actualizar información del producto, como unidades en existencias, nivel de reordenación, etc. Nuestra aplicación web también podría permitir que los usuarios anónimos realicen visitas (personas que no han iniciado sesión), pero las limitarían a ver solo los datos. Con este sistema de cuentas de usuario implementado, queremos que los controles web de datos de nuestras páginas de ASP.NET ofrezcan las funcionalidades de inserción, edición y eliminación adecuadas para el usuario que ha iniciado sesión actualmente.

En este tutorial se examinará cómo ajustar dinámicamente las funcionalidades de modificación de datos en función del usuario visitante. En concreto, crearemos una página que muestre la información de los proveedores en una DetailsView editable junto con una GridView que muestre los productos proporcionados por el proveedor. Si el usuario que visita la página es de nuestra empresa, puede: ver cualquier información del proveedor; editar su dirección; y editar la información de cualquier producto proporcionado por el proveedor. Sin embargo, si el usuario es de una empresa determinada, solo puede ver y editar su propia información de dirección y solo puede editar los productos que no se han marcado como descatalogados.

A User from Our Company Can Edit Any Supplier s Information

Figura 1: Un usuario de nuestra empresa puede editar cualquier información del proveedor (haga clic para ver la imagen en tamaño completo)

A User from a Particular Supplier Can Only View and Edit their Information

Figura 2: Un usuario de un proveedor determinado solo puede ver y editar su información (haga clic para ver la imagen en tamaño completo)

¡Comencemos!

Nota:

El sistema de pertenencia de ASP.NET 2.0 proporciona una plataforma estandarizada y extensible para crear, administrar y validar cuentas de usuario. Dado que un examen del sistema de pertenencia está fuera del ámbito de estos tutoriales, este tutorial en su lugar "falsifica" la pertenencia permitiendo a los visitantes anónimos elegir si son de un proveedor determinado o de nuestra empresa. Para obtener más información sobre la pertenencia, consulte la serie de artículos Información sobre la pertenencia, los roles y perfiles en ASP.NET 2.0.

Paso 1: Permitir que el usuario especifique sus derechos de acceso

En una aplicación web real, la información de una cuenta de usuario incluiría si trabajaban para nuestra empresa o para un proveedor determinado, y esta información sería accesible mediante programación desde nuestras páginas de ASP.NET una vez que el usuario haya iniciado sesión en el sitio. Esta información se puede capturar mediante el sistema de roles de ASP.NET 2.0 como información de cuenta de nivel de usuario a través del sistema de perfiles o a través de algunos medios personalizados.

Dado que el objetivo de este tutorial es demostrar el ajuste de las funcionalidades de modificación de datos basadas en el usuario que ha iniciado sesión, y no está pensado para mostrar los sistemas de pertenencia, roles y perfiles de ASP.NET 2.0, usaremos un mecanismo muy sencillo para determinar las funcionalidades para el usuario que visita la página: una DropDownList en la que el usuario puede indicar si debería poder ver y editar cualquiera de la información de los proveedores o, como alternativa, la información del proveedor en particular que puede ver y editar. Si el usuario indica que puede ver y editar toda la información del proveedor (el valor predeterminado), puede paginar por todos los proveedores, editar cualquier información de dirección del proveedor y editar el nombre y la cantidad por unidad para cualquier producto proporcionado por el proveedor seleccionado. Sin embargo, si el usuario indica que solo puede ver y editar un proveedor determinado, solo puede ver los detalles y los productos de ese proveedor y solo puede actualizar el nombre y la cantidad por información de unidad para esos productos que no están descatalogados.

Nuestro primer paso en este tutorial es crear esta DropDownList y rellenarla con los proveedores del sistema. Abra la página UserLevelAccess.aspx en la carpeta EditInsertDelete, agregue una DropDownList cuya propiedad ID esté establecida en Suppliers y enlace esta DropDownList a un nuevo ObjectDataSource denominado AllSuppliersDataSource.

Create a New ObjectDataSource Named AllSuppliersDataSource

Figura 3: Crear un nuevo ObjectDataSource denominado AllSuppliersDataSource (Haga clic para ver la imagen de tamaño completo)

Puesto que queremos que esta DropDownList incluya todos los proveedores, configure ObjectDataSource para que invoque al método de la clase SuppliersBLL, GetSuppliers(). Asegúrese también de que el método ObjectDataSource Update() está asignado al método SuppliersBLL de la clase UpdateSupplierAddress, ya que el elemento DetailsView también usará esta clase ObjectDataSource que agregaremos en el paso 2.

Después de completar el asistente ObjectDataSource, complete los pasos mediante la configuración de la DropDownList Suppliers de modo que muestre el campo de datos CompanyName y use el campo de datos SupplierID como valor para cada ListItem.

Configure the Suppliers DropDownList to Use the CompanyName and SupplierID Data Fields

Figura 4: Configurar la DropDownList Suppliers para que utilice los campos de datos CompanyName y SupplierID (Haga clic para ver la imagen de tamaño completo)

En este momento, la DropDownList enumera los nombres de empresa de los proveedores de la base de datos. Sin embargo, también es necesario incluir una opción "Mostrar o editar todos los proveedores" en la DropDownList. Para ello, establezca la propiedad DropDownList Suppliers de AppendDataBoundItems en true y agregue una ListItem cuya propiedad Text sea "Mostrar o editar todos los proveedores" y cuyo valor sea -1. Esto se puede agregar directamente mediante el marcado declarativo o mediante el Diseñador; para ello, vaya a la ventana Propiedades y haga clic en los puntos suspensivos de la propiedad Items de DropDownList.

Nota:

Consulte el tutorial Filtrado de elementos principales/detalles con una lista desplegable para obtener una explicación más detallada sobre cómo agregar un elemento Select All (Seleccionar todo) a una DropDownList de entrada de datos.

Una vez establecida la propiedad AppendDataBoundItems y agregado ListItem, el marcado declarativo de DropDownList debe ser similar al siguiente:

<asp:DropDownList ID="Suppliers" runat="server" AppendDataBoundItems="True"
    DataSourceID="AllSuppliersDataSource" DataTextField="CompanyName"
    DataValueField="SupplierID">
    <asp:ListItem Value="-1">Show/Edit ALL Suppliers</asp:ListItem>
</asp:DropDownList>

En la figura 5 se muestra una captura de pantalla de lo que llevamos hecho hasta ahora visto a través de un explorador.

The Suppliers DropDownList Contains a Show ALL ListItem, Plus One for Each Supplier

Figura 5: La lista desplegable Suppliers contiene un ListItem Show ALL (Mostrar TODO), más uno para cada proveedor (haga clic para ver la imagen en tamaño completo)

Puesto que queremos actualizar la interfaz de usuario inmediatamente después de que el usuario haya cambiado su selección, establezca la propiedad de DropDownList Suppliers, AutoPostBack, en true. En el paso 2, crearemos un control DetailsView que mostrará la información de los proveedores en función de la selección de DropDownList. A continuación, en el paso 3, crearemos un controlador de eventos para este evento DropDownList SelectedIndexChanged, en el que agregaremos código que enlaza la información de proveedor adecuada a DetailsView en función del proveedor seleccionado.

Paso 2: Adición de un control DetailsView

Vamos a usar DetailsView para mostrar la información del proveedor. Para el usuario que puede ver y editar todos los proveedores, DetailsView admitirá la paginación, lo que permite al usuario recorrer la información del proveedor un registro cada vez. Sin embargo, si el usuario trabaja para un proveedor determinado, DetailsView mostrará solo esa información del proveedor en particular y no incluirá una interfaz de paginación. En cualquier caso, DetailsView debe permitir al usuario editar los campos de dirección, ciudad y país del proveedor.

Agregue un DetailsView a la página debajo de DropDownList Suppliers, establezca su propiedad ID en SupplierDetails y vincúlelo a AllSuppliersDataSource de ObjectDataSource creado en el paso anterior. A continuación, active las casillas Habilitar paginación y Habilitar edición en la etiqueta inteligente DetailsView.

Nota:

Si no ve la opción Habilitar edición en la etiqueta inteligente DetailsView, se debe a que no ha asignado el método Update() de ObjectDataSource al método SuppliersBLL de la clase UpdateSupplierAddress. Tómese un momento para volver atrás y realizar este cambio de configuración, después de lo cual la opción Habilitar edición debería aparecer en la etiqueta inteligente DetailsView.

Dado que el método de la clase SuppliersBLL, UpdateSupplierAddress, solo acepta cuatro parámetros: supplierID. address, city y country, modifica los BoundFields de DetailsView para que los BoundFields CompanyName y Phone sean de solo lectura. Además, quite BoundField SupplierID por completo. Por último, ObjectDataSource AllSuppliersDataSource tiene actualmente su propiedad OldValuesParameterFormatString establecida en original_{0}. Dedique un momento a quitar esta configuración de propiedad de la sintaxis declarativa por completo o establézcala en el valor predeterminado, {0}.

Después de configurar DetailsView SupplierDetails y ObjectDataSource AllSuppliersDataSource, tendremos el siguiente marcado declarativo:

<asp:ObjectDataSource ID="AllSuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLL"
    UpdateMethod="UpdateSupplierAddress">
    <UpdateParameters>
        <asp:Parameter Name="supplierID" Type="Int32" />
        <asp:Parameter Name="address" Type="String" />
        <asp:Parameter Name="city" Type="String" />
        <asp:Parameter Name="country" Type="String" />
    </UpdateParameters>
</asp:ObjectDataSource>
<asp:DetailsView ID="SupplierDetails" runat="server" AllowPaging="True"
    AutoGenerateRows="False" DataKeyNames="SupplierID"
    DataSourceID="AllSuppliersDataSource">
    <Fields>
        <asp:BoundField DataField="CompanyName" HeaderText="Company"
            ReadOnly="True" SortExpression="CompanyName" />
        <asp:BoundField DataField="Address" HeaderText="Address"
            SortExpression="Address" />
        <asp:BoundField DataField="City" HeaderText="City"
            SortExpression="City" />
        <asp:BoundField DataField="Country" HeaderText="Country"
            SortExpression="Country" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" ReadOnly="True"
            SortExpression="Phone" />
        <asp:CommandField ShowEditButton="True" />
    </Fields>
</asp:DetailsView>

En este momento, DetailsView se puede paginar y la información de dirección del proveedor seleccionado se puede actualizar, independientemente de la selección realizada en DropDownList Suppliers (vea la figura 6).

Any Suppliers Information Can Be Viewed, and Its Address Updated

Figura 6: Se puede ver cualquier información de proveedores y su dirección actualizada (haga clic para ver la imagen en tamaño completo)

Paso 3: Mostrar solo la información del proveedor seleccionado

Nuestra página muestra actualmente la información de todos los proveedores independientemente de si se ha seleccionado un proveedor determinado en DropDownList Suppliers. Para mostrar solo la información del proveedor para el proveedor seleccionado, necesitamos agregar otro ObjectDataSource a nuestra página, uno que recupere información sobre un proveedor determinado.

Agregue un nuevo ObjectDataSource a la página y asígnele el nombre SingleSupplierDataSource. En su etiqueta inteligente, haga clic en el vínculo Configurar origen de datos y haga que use el método de la clase SuppliersBLL, GetSupplierBySupplierID(supplierID). Al igual que con ObjectDataSource AllSuppliersDataSource, tenga asignado el método SingleSupplierDataSource de ObjectDataSource Update() al método de la clase SuppliersBLL, UpdateSupplierAddress.

Configure the SingleSupplierDataSource ObjectDataSource to Use the GetSupplierBySupplierID(supplierID) Method

Figura 7: configuración de ObjectDataSource SingleSupplierDataSource para usar el método GetSupplierBySupplierID(supplierID) (haga clic para ver la imagen a tamaño completo).

A continuación, se le pedirá que especifique el origen del parámetro para el parámetro de entrada del método GetSupplierBySupplierID(supplierID), supplierID. Puesto que queremos mostrar la información del proveedor seleccionado en DropDownList, use la propiedad de DropDownList Suppliers, SelectedValue, como origen del parámetro.

Use the Suppliers DropDownList as the supplierID Parameter Source

Figura 8: Use la DropDownList Suppliers como origen del parámetro supplierID (Haga clic para ver la imagen en tamaño completo)

Incluso con este segundo objectDataSource agregado, el control DetailsView está configurado actualmente para usar siempre ObjectDataSource AllSuppliersDataSource. Es necesario agregar lógica para ajustar el origen de datos usado por DetailsView en función del elemento Suppliers de DropDownList seleccionado. Para ello, cree un controlador de eventos SelectedIndexChanged para la DropDownList de proveedores. Esto se puede crear con más facilidad haciendo doble clic en DropDownList en el Diseñador. Este controlador de eventos debe determinar qué origen de datos usar y debe volver a enlazar los datos a DetailsView. Esto se realiza mediante el código siguiente:

Protected Sub Suppliers_SelectedIndexChanged _
    (ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Suppliers.SelectedIndexChanged
    If Suppliers.SelectedValue = "-1" Then
        ' The "Show/Edit ALL" option has been selected
        SupplierDetails.DataSourceID = "AllSuppliersDataSource"
        ' Reset the page index to show the first record
        SupplierDetails.PageIndex = 0
    Else
        ' The user picked a particular supplier
        SupplierDetails.DataSourceID = "SingleSupplierDataSource"
    End If
    ' Ensure that the DetailsView and GridView are in read-only mode
    SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly)
    ' Need to "refresh" the DetailsView
    SupplierDetails.DataBind()
End Sub

El controlador de eventos comienza por determinar si se seleccionó la opción "Mostrar o editar todos los proveedores". Si es así, establece la DetailsView SupplierDetails, DataSourceID en AllSuppliersDataSource y devuelve al usuario el primer registro del conjunto de proveedores estableciendo la propiedad PageIndex en 0. Sin embargo, si el usuario ha seleccionado un proveedor determinado de DropDownList, DetailsView DataSourceID se asigna a SingleSuppliersDataSource. Independientemente del origen de datos que se use, el modo SuppliersDetails se revierte al modo de solo lectura y los datos se vuelven a enlazar a DetailsView mediante una llamada al método SuppliersDetails del control DataBind().

Con este controlador de eventos en su lugar, el control DetailsView ahora muestra el proveedor seleccionado, a menos que se haya seleccionado la opción "Mostrar/Editar todos los proveedores", en cuyo caso todos los proveedores se pueden ver mediante la interfaz de paginación. La figura 9 muestra la página con la opción "Mostrar/Editar todos los proveedores" seleccionada; tenga en cuenta que la interfaz de paginación está presente, lo que permite al usuario visitar y actualizar cualquier proveedor. En la figura 10 se muestra la página con el proveedor Ma Maison seleccionado. Solo la información de Ma Maison es visible y editable en este caso.

All of the Suppliers Information Can Be Viewed and Edited

Figura 9: Toda la información de proveedores se puede ver y editar (haga clic para ver la imagen en tamaño completo)

Only the Selected Supplier s Information Can Be Viewed and Edited

Figura 10: Solo la información de proveedores seleccionada se puede ver y editar (haga clic para ver la imagen en tamaño completo)

Nota:

Para este tutorial, los controles EnableViewState de DropDownList y DetailsView deben establecerse en true (el valor predeterminado) porque los cambios de la propiedad DropDownList SelectedIndex y DetailsView DataSourceID deben recordarse entre postbacks.

Paso 4: Enumeración de los productos de proveedores en un control GridView editable

Con DetailsView completado, nuestro siguiente paso es incluir una GridView editable que enumere los productos proporcionados por el proveedor seleccionado. Esta clase GridView debe permitir modificaciones solo en los campos ProductName y QuantityPerUnit. Además, si el usuario que visita la página es de un proveedor determinado, solo debe permitir realizar actualizaciones a esos productos que no están descatalogados. Para ello, primero es necesario agregar una sobrecarga del método de la clase ProductsBLL, UpdateProducts, que toma solo los campos ProductID, ProductName y QuantityPerUnit como entradas. Hemos recorrido este proceso de antemano en numerosos tutoriales, así que echemos un vistazo al código aquí, que se debe agregar a ProductsBLL:

<System.ComponentModel.DataObjectMethodAttribute _
(System.ComponentModel.DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(ByVal productName As String, _
    ByVal quantityPerUnit As String, ByVal productID As Integer) As Boolean
    Dim products As Northwind.ProductsDataTable = Adapter.GetProductByProductID(productID)
    If products.Count = 0 Then
        ' no matching record found, return false
        Return False
    End If
    Dim product As Northwind.ProductsRow = products(0)
    product.ProductName = productName
    If quantityPerUnit Is Nothing Then
        product.SetQuantityPerUnitNull()
    Else
        product.QuantityPerUnit = quantityPerUnit
    End If
    ' Update the product record
    Dim rowsAffected As Integer = Adapter.Update(product)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function

Con esta sobrecarga creada, estamos listos para agregar el control GridView y su ObjectDataSource asociado. Agregue una nueva clase GridView a la página, establezca su propiedad ID en ProductsBySupplier y configúrela para usar un nuevo ObjectDataSource denominado ProductsBySupplierDataSource. Puesto que queremos que GridView muestre esos productos del proveedor seleccionado, use el método de la clase ProductsBLL, GetProductsBySupplierID(supplierID). Asigne también el método Update() a la nueva sobrecarga UpdateProduct que acabamos de crear.

Configure the ObjectDataSource to Use the UpdateProduct Overload Just Created

Figura 11: Configuración de ObjectDataSource para usar la sobrecarga de UpdateProduct que se acaba de crear (Haga clic para ver la imagen a tamaño completo)

Se le pedirá que seleccione el origen del parámetro para el parámetro de entrada del método GetProductsBySupplierID(supplierID), supplierID. Puesto que queremos mostrar los productos para el proveedor seleccionado en DetailsView, use la propiedad del control DetailsView SuppliersDetails, SelectedValue, como origen del parámetro.

Use the SuppliersDetails DetailsView s SelectedValue Property as the Parameter Source

Figura 12: Use la propiedad SuppliersDetails de DetailsView SelectedValue como origen de parámetros (haga clic para ver la imagen a tamaño completo)

Volviendo a GridView, quite todos los campos GridView, excepto para ProductName, QuantityPerUnity Discontinued, marcando CheckBoxField Discontinued como de solo lectura. Además, active la opción Habilitar edición desde la etiqueta inteligente GridView. Tras estos cambios, el marcado declarativo de GridView y ObjectDataSource debería tener un aspecto similar al siguiente:

<asp:GridView ID="ProductsBySupplier" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsBySupplierDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit"
            SortExpression="QuantityPerUnit" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            ReadOnly="True" SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsBySupplierDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsBySupplierID" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="quantityPerUnit" Type="String" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="SupplierDetails" Name="supplierID"
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Al igual que con ObjectDataSources anteriores, esta propiedad OldValuesParameterFormatString se establece en original_{0}, lo que provocará problemas al intentar actualizar el nombre o la cantidad de un producto por unidad. Quite esta propiedad de la sintaxis declarativa por completo o establézcala en su valor predeterminado, {0}.

Con esta configuración completa, nuestra página muestra ahora los productos proporcionados por el proveedor seleccionado en GridView (vea la figura 13). Actualmente, se puede actualizar cualquier nombre o cantidad del producto por unidad. Sin embargo, es necesario actualizar la lógica de la página para que dicha funcionalidad esté prohibida para los productos descatalogados para los usuarios asociados a un proveedor determinado. Abordaremos este último ámbito en el paso 5.

The Products Provided by the Selected Supplier are Displayed

Figura 13: se muestran los productos proporcionados por el proveedor seleccionado (haga clic para ver la imagen a tamaño completo)

Nota:

Con la adición de esta GridView editable, el controlador de eventos de la DropDownList Suppliers, SelectedIndexChanged, debe actualizarse para que devuelva GridView al estado de solo lectura. De lo contrario, si se selecciona un proveedor diferente mientras se encuentra en medio de la edición de información del producto, también se podrá editar el índice correspondiente en GridView para el nuevo proveedor. Para evitar esto, simplemente establezca la propiedad EditIndex de GridView en -1 en en el controlador de eventos SelectedIndexChanged.

Además, recuerde que es importante que el estado de vista de GridView esté habilitado (lo está por defecto). Si establece la propiedad EnableViewState de GridView en false, corre el riesgo de que los usuarios simultáneos eliminen o editen registros accidentalmente.

Paso 5: No permitir la edición de productos descatalogados cuando no se selecciona Mostrar o editar todos los proveedores

Aunque GridView ProductsBySupplier es totalmente funcional, actualmente concede demasiado acceso a los usuarios que proceden de un proveedor determinado. Según nuestras reglas de negocio, estos usuarios no deben poder actualizar los productos descatalogados. Para aplicar esto, podemos ocultar (o deshabilitar) el botón Editar en aquellas filas de GridView con productos descatalogados cuando un usuario visita la página de un proveedor.

Cree un controlador de eventos para el evento RowDataBound de GridView. En este controlador de eventos, es necesario determinar si el usuario está asociado a un proveedor determinado, que, para este tutorial, se puede determinar comprobando la propiedad DropDownList de Suppliers (Proveedores) SelectedValue. Si es distinta de -1, el usuario está asociado a un proveedor determinado. Para estos usuarios, es necesario determinar si el producto está o no descatalogado. Podemos obtener una referencia a la instancia real ProductRow enlazada a la fila GridView mediante la propiedad e.Row.DataItem, como se describe en el tutorial Visualización de información de resumen en el pie de página de GridView. Si el producto está descatalogado, podemos obtener una referencia mediante programación al botón Editar en el CommandField de GridView mediante las técnicas descritas en el tutorial anterior, Agregar confirmación del lado del cliente al eliminar. Una vez que tengamos una referencia, podemos ocultar o deshabilitar el botón.

Protected Sub ProductsBySupplier_RowDataBound _
    (ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
    Handles ProductsBySupplier.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' Is this a supplier-specific user?
        If Suppliers.SelectedValue <> "-1" Then
            ' Get a reference to the ProductRow
            Dim product As Northwind.ProductsRow = _
                CType(CType(e.Row.DataItem, System.Data.DataRowView).Row, _
                Northwind.ProductsRow)
            ' Is this product discontinued?
            If product.Discontinued Then
                ' Get a reference to the Edit LinkButton
                Dim editButton As LinkButton = _
                    CType(e.Row.Cells(0).Controls(0), LinkButton)
                ' Hide the Edit button
                editButton.Visible = False
            End If
        End If
    End If
End Sub

Con este controlador de eventos establecido, al visitar esta página como usuario de un proveedor específico, los productos descatalogados no se pueden editar, ya que el botón Editar está oculto para estos productos. Por ejemplo, Chef Anton's Gumbo Mix es un producto descatalogado para el proveedor New Orleans Cajun Delights. Al visitar la página de este proveedor en particular, el botón Editar para este producto está oculto a la vista (vea la figura 14). Sin embargo, al visitar usando el botón "Mostrar/editar todos los proveedores", el botón Editar está disponible (vea la figura 15).

For Supplier-Specific Users the Edit Button for Chef Anton s Gumbo Mix is Hidden

Figura 14: Para usuarios específicos del proveedor, el botón Editar para Chef Anton's Gumbo Mix está oculto (haga clic para ver la imagen a tamaño completo)

For Show/Edit ALL Suppliers Users, the Edit Button for Chef Anton s Gumbo Mix is Displayed

Figura 15: Para los usuarios que utilizan Mostrar/editar todos los proveedores, se muestra el botón Editar para Chef Anton's Gumbo Mix (haga clic para ver la imagen a tamaño completo)

Comprobación de los derechos de acceso en la capa de lógica de negocios

En este tutorial, la página ASP.NET controla toda la lógica con respecto a la información que el usuario puede ver y qué productos puede actualizar. Idealmente, esta lógica también estaría presente en la capa lógica de negocios. Por ejemplo, el método de la clase SuppliersBLL, GetSuppliers() (que devuelve todos los proveedores), puede incluir una comprobación para asegurarse de que el usuario que ha iniciado sesión no está asociado a un proveedor específico. Del mismo modo, el método UpdateSupplierAddress podría incluir una comprobación para asegurarse de que el usuario que ha iniciado sesión ha trabajado para nuestra empresa (y, por lo tanto, puede actualizar toda la información de direcciones de proveedores) o está asociado con el proveedor cuyos datos se están actualizando.

No he incluido estas comprobaciones de nivel BLL aquí porque en nuestro tutorial los derechos del usuario están determinados por una DropDownList en la página, a la que las clases BLL no pueden acceder. Cuando se usa el sistema de pertenencia o uno de los esquemas de autenticación integrados proporcionados por ASP.NET (por ejemplo, autenticación de Windows), se puede acceder a la información del usuario y a la información de roles desde la BLL, lo que hace que estos derechos de acceso sean posibles en las capas de presentación y BLL.

Resumen

La mayoría de los sitios que proporcionan cuentas de usuario deben personalizar la interfaz de modificación de datos en función del usuario que ha iniciado sesión. Los usuarios administrativos pueden eliminar y editar cualquier registro, mientras que los usuarios que no son administrativos pueden limitarse solo a actualizar o eliminar registros que crearon. Sea cual sea el escenario, se pueden ampliar los controles web de datos, las clases ObjectDataSource y capa lógica de negocios para agregar o denegar determinadas funcionalidades basándose en el usuario que ha iniciado sesión. En este tutorial vimos cómo limitar los datos visibles y editables en función de si el usuario estaba asociado a un proveedor determinado o si trabajaba para nuestra empresa.

En este tutorial se concluye el análisis de la inserción, actualización y eliminación de datos mediante los controles GridView, DetailsView y FormView. A partir del siguiente tutorial, nos centraremos en agregar compatibilidad de paginación y ordenación.

¡Feliz programación!

Acerca del autor

Scott Mitchell, autor de siete libros de ASP/ASP.NET y fundador de 4GuysFromRolla.com, ha trabajado con tecnologías web de Microsoft desde 1998. Scott trabaja como consultor independiente, entrenador y escritor. Su último libro es Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Puede ponerse en contacto con él a través de mitchell@4GuysFromRolla.com. o de su blog, que se puede encontrar en http://ScottOnWriting.NET.