Partilhar via


Limitando a funcionalidade de modificação de dados com base no usuário (C#)

por Scott Mitchell

Descarregar PDF

Em um aplicativo Web que permite aos usuários editar dados, diferentes contas de usuário podem ter diferentes privilégios de edição de dados. Neste tutorial, examinaremos como ajustar dinamicamente os recursos de modificação de dados com base no usuário visitante.

Introdução

Vários aplicativos da Web suportam contas de usuário e fornecem diferentes opções, relatórios e funcionalidades com base no usuário conectado. Por exemplo, com nossos tutoriais, podemos permitir que os usuários das empresas fornecedoras façam logon no site e atualizem informações gerais sobre seus produtos - seu nome e quantidade por unidade, talvez - juntamente com informações do fornecedor, como o nome da empresa, endereço, informações da pessoa de contato e assim por diante. Além disso, podemos querer incluir algumas contas de usuário para pessoas da nossa empresa para que elas possam fazer logon e atualizar informações do produto, como unidades em estoque, nível de reordenação e assim por diante. A nossa aplicação Web também pode permitir a visita de utilizadores anónimos (pessoas que não iniciaram sessão), mas limitá-los-ia apenas à visualização de dados. Com esse sistema de conta de usuário em vigor, gostaríamos que os controles da Web de dados em nossas páginas de ASP.NET oferecessem os recursos de inserção, edição e exclusão apropriados para o usuário conectado no momento.

Neste tutorial, examinaremos como ajustar dinamicamente os recursos de modificação de dados com base no usuário visitante. Em particular, criaremos uma página que exibe as informações dos fornecedores em um DetailsView editável, juntamente com um GridView que lista os produtos fornecidos pelo fornecedor. Se o utilizador que visita a página é da nossa empresa, pode: visualizar qualquer informação do fornecedor; editar o endereço; e editar as informações de qualquer produto fornecido pelo fornecedor. Se, no entanto, o usuário for de uma determinada empresa, ele só pode visualizar e editar suas próprias informações de endereço e só pode editar seus produtos que não foram marcados como descontinuados.

Um usuário de nossa empresa pode editar as informações de qualquer fornecedor

Figura 1: Um usuário de nossa empresa pode editar as informações de qualquer fornecedor (Clique para visualizar a imagem em tamanho real)

Um usuário de um determinado fornecedor só pode visualizar e editar suas informações

Figura 2: Um usuário de um determinado fornecedor só pode visualizar e editar suas informações (Clique para visualizar a imagem em tamanho real)

Vamos começar!

Observação

O sistema de associação do ASP.NET 2.0 oferece uma plataforma padrão e extensível para criar, gerir e validar contas de utilizadores. Uma vez que um exame do sistema de associação está além do escopo desses tutoriais, este tutorial em vez disso "falsifica" a adesão, permitindo que visitantes anônimos escolham se são de um fornecedor específico ou de nossa empresa. Para obter mais informações sobre associação, consulte minha série de artigos Examinando ASP.NET 2.0 s Associação, Funções e Perfil .

Etapa 1: Permitindo que o usuário especifique seus direitos de acesso

Em um aplicativo da Web do mundo real, as informações da conta de um usuário incluiriam se ele trabalhou para nossa empresa ou para um fornecedor específico, e essas informações seriam programaticamente acessíveis a partir de nossas páginas ASP.NET depois que o usuário fizesse logon no site. Essas informações podem ser capturadas através do sistema de funções do ASP.NET 2.0, como informações de conta no nível do utilizador através do sistema de perfil, ou por alguns meios personalizados.

Como o objetivo deste tutorial é demonstrar o ajuste das capacidades de modificação de dados com base no usuário conectado, e não se destina a mostrar os sistemas de associação, funções e perfis do ASP.NET 2.0, usaremos um mecanismo muito simples para determinar as capacidades para o usuário que visita a página - uma lista pendente a partir da qual o usuário pode indicar se deve ser capaz de visualizar e editar qualquer informação dos fornecedores ou, alternativamente, quais as informações específicas do fornecedor que pode visualizar e editar. Se o usuário indicar que pode visualizar e editar todas as informações do fornecedor (o padrão), ele pode percorrer todos os fornecedores, editar as informações de endereço de qualquer fornecedor e editar o nome e a quantidade por unidade para qualquer produto fornecido pelo fornecedor selecionado. No entanto, se o utilizador indicar que só pode ver e editar um determinado fornecedor, só pode ver os detalhes e os produtos desse fornecedor e só pode atualizar as informações de nome e quantidade por unidade para os produtos que não são descontinuados.

Nosso primeiro passo neste tutorial, então, é criar este DropDownList e preenchê-lo com os fornecedores no sistema. Abra a UserLevelAccess.aspx página na EditInsertDelete pasta, adicione um DropDownList cuja ID propriedade está definida como Suppliers, e associe este DropDownList a um novo ObjectDataSource chamado AllSuppliersDataSource.

Criar um novo ObjectDataSource chamado AllSuppliersDataSource

Figura 3: Criar um novo ObjectDataSource nomeado AllSuppliersDataSource (Clique para visualizar a imagem em tamanho real)

Como queremos que esse DropDownList inclua todos os fornecedores, configure o ObjectDataSource para invocar o método s SuppliersBLL da GetSuppliers() classe. Certifique-se também de que o método ObjectDataSource s Update() esteja mapeado para o método s SuppliersBLL da UpdateSupplierAddress classe, pois esse ObjectDataSource também será usado pelo DetailsView que adicionaremos na Etapa 2.

Depois de concluir o assistente ObjectDataSource, conclua as etapas configurando o Suppliers DropDownList de modo que ele mostre o CompanyName campo de dados e use o SupplierID campo de dados como o valor para cada ListItem.

Configure o Suppliers DropDownList para usar os campos de dados CompanyName e SupplierID

Figura 4: Configurar o Suppliers DropDownList para usar os campos de CompanyName e SupplierID dados (Clique para visualizar a imagem em tamanho real)

Neste ponto, o DropDownList lista os nomes das empresas dos fornecedores no banco de dados. No entanto, também precisamos incluir uma opção "Mostrar / Editar TODOS os fornecedores" na DropDownList. Para fazer isso, defina a Suppliers propriedade DropDownList s como AppendDataBoundItems e, em seguida, adicione uma true cuja ListItem propriedade é "Mostrar/Editar TODOS os Text fornecedores" e cujo valor é -1. Isso pode ser adicionado diretamente através da marcação declarativa ou através do Designer, indo para a janela Propriedades e clicando nas reticências na propriedade Items do DropDownList.

Observação

Consulte novamente o tutorial Master/Detail Filtering With a DropDownList para obter uma discussão mais detalhada sobre como adicionar um item Select All a um DropDownList vinculado a dados.

Depois que a AppendDataBoundItems propriedade tiver sido definida e adicionada ListItem , a marcação declarativa do DropDownList deverá ter a seguinte aparência:

<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>

A Figura 5 mostra uma captura de tela do nosso progresso atual, quando visualizado através de um navegador.

O Suppliers DropDownList contém um show ALL ListItem, além de um para cada fornecedor

Figura 5: O Suppliers DropDownList contém um show ALL ListItem, mais um para cada fornecedor (Clique para visualizar a imagem em tamanho real)

Como queremos atualizar a interface do usuário imediatamente após o usuário ter alterado sua seleção, defina a Suppliers propriedade DropDownList s AutoPostBack como true. Na Etapa 2, criaremos um controle DetailsView que mostrará as informações do(s) fornecedor(es) com base na seleção DropDownList. Em seguida, na Etapa 3, criaremos um manipulador de eventos para esse evento DropDownList SelectedIndexChanged , no qual adicionaremos código que vincula as informações apropriadas do fornecedor ao DetailsView com base no fornecedor selecionado.

Etapa 2: Adicionando um controle DetailsView

Vamos usar um DetailsView para mostrar as informações do fornecedor. Para o usuário que pode visualizar e editar todos os fornecedores, o DetailsView suportará paginação, permitindo que o usuário percorra as informações do fornecedor um registro de cada vez. No entanto, se o usuário trabalhar para um determinado fornecedor, o DetailsView mostrará apenas as informações desse fornecedor específico e não incluirá uma interface de paginação. Em ambos os casos, o DetailsView precisa permitir que o usuário edite os campos de endereço, cidade e país do fornecedor.

Adicione um DetailsView à página abaixo de Suppliers DropDownList, defina sua ID propriedade como SupplierDetails, e associe-o ao AllSuppliersDataSource ObjectDataSource criado na etapa anterior. Em seguida, marque as caixas de seleção Ativar Paginação e Ativar Edição na tag inteligente DetailsView.

Observação

Se não vir uma opção para Habilitar Edição na smart tag da DetailsView, é porque não mapeou o método do ObjectDataSource para o método Update() da classe SuppliersBLL. Dedique um momento para regressar e efetuar essa alteração na configuração, após o que a opção Ativar edição deve aparecer na marca inteligente do DetailsView.

Como o método da SuppliersBLL classe aceita só quatro parâmetros - UpdateSupplierAddress, supplierID, address, e city - modifique os BoundFields de DetailsView para que os country e CompanyName BoundFields sejam apenas leitura. Além disso, remova o SupplierID BoundField completamente. Finalmente, o AllSuppliersDataSource ObjectDataSource atualmente tem sua OldValuesParameterFormatString propriedade definida como original_{0}. Reserve um momento para remover completamente essa configuração de propriedade da sintaxe declarativa ou defina-a com o valor padrão, {0}.

Depois de configurar o SupplierDetails DetailsView e o AllSuppliersDataSource ObjectDataSource, teremos a seguinte marcação declarativa:

<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>

Neste ponto, o DetailsView pode ser paginado e as informações de endereço do fornecedor selecionado podem ser atualizadas, independentemente da seleção feita na DropDownList (consulte a Suppliers Figura 6).

Todas as informações dos fornecedores podem ser visualizadas e seu endereço atualizado

Figura 6: Todas as informações dos fornecedores podem ser visualizadas e seu endereço atualizado (Clique para visualizar a imagem em tamanho real)

Etapa 3: Exibindo apenas as informações do fornecedor selecionado

Nossa página atualmente exibe as informações de todos os fornecedores, independentemente de um determinado fornecedor ter sido selecionado na Suppliers DropDownList. Para exibir apenas as informações do fornecedor selecionado, precisamos adicionar outro ObjectDataSource à nossa página, que recupere informações sobre um determinado fornecedor.

Adicione um novo ObjectDataSource à página, nomeando-a SingleSupplierDataSource. Na sua tag inteligente, clique no link Configurar fonte de dados e faça com que use o método SuppliersBLL da classe GetSupplierBySupplierID(supplierID). Assim como acontece com o AllSuppliersDataSource ObjectDataSource, tenha o SingleSupplierDataSource método s ObjectDataSource mapeado Update() para o método s SuppliersBLL da UpdateSupplierAddress classe.

Configure o SingleSupplierDataSource ObjectDataSource para usar o método GetSupplierBySupplierID(supplierID)

Figura 7: Configurar o SingleSupplierDataSource ObjectDataSource para usar o método (GetSupplierBySupplierID(supplierID) imagem em tamanho real)

Em seguida, é-nos pedido que especifiquemos a fonte do parâmetro para o parâmetro de entrada do método GetSupplierBySupplierID(supplierID)supplierID. Como queremos mostrar as informações do fornecedor selecionado no DropDownList, use a Suppliers propriedade DropDownList s SelectedValue como a fonte do parâmetro.

Use o Suppliers DropDownList como a fonte do parâmetro supplierID

Figura 8: Use o Suppliers DropDownList como a fonte do parâmetro (supplierID imagem em tamanho real)

Mesmo com esse segundo ObjectDataSource adicionado, o controle DetailsView está atualmente configurado para sempre usar o AllSuppliersDataSource ObjectDataSource. Precisamos adicionar lógica para ajustar a fonte de dados usada pelo DetailsView dependendo do Suppliers item DropDownList selecionado. Para fazer isso, crie um SelectedIndexChanged manipulador de eventos para o Suppliers DropDownList. Isso pode ser criado mais facilmente clicando duas vezes na DropDownList no Designer. Esse manipulador de eventos precisa determinar qual fonte de dados usar e deve revincular os dados ao DetailsView. Isso é feito com o seguinte código:

protected void Suppliers_SelectedIndexChanged(object sender, EventArgs e)
{
    if (Suppliers.SelectedValue == "-1")
    {
        // 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";
    // Ensure that the DetailsView is in read-only mode
    SupplierDetails.ChangeMode(DetailsViewMode.ReadOnly);
    // Need to "refresh" the DetailsView
    SupplierDetails.DataBind();
}

O manipulador de eventos começa determinando se a opção "Mostrar/Editar TODOS os fornecedores" foi selecionada. Se fosse, ele define o SupplierDetails DetailsView s DataSourceID como AllSuppliersDataSource e retorna o usuário ao primeiro registro no conjunto de fornecedores, definindo a PageIndex propriedade como 0. Se, no entanto, o usuário selecionou um fornecedor específico na DropDownList, o DetailsView s DataSourceID é atribuído a SingleSuppliersDataSource. Independentemente da fonte de dados usada, o SuppliersDetails modo é revertido para o modo somente leitura e os dados são redirecionados para o DetailsView por uma chamada para o SuppliersDetails método s de DataBind() controle.

Com esse manipulador de eventos instalado, o controle DetailsView agora mostra o fornecedor selecionado, a menos que a opção "Mostrar/Editar TODOS os fornecedores" tenha sido selecionada, caso em que todos os fornecedores podem ser visualizados por meio da interface de paginação. A Figura 9 mostra a página com a opção "Mostrar/Editar TODOS os Fornecedores" selecionada; Observe que a interface de paginação está presente, permitindo que o usuário visite e atualize qualquer fornecedor. A Figura 10 mostra a página com o fornecedor da Ma Maison selecionado. Apenas as informações da Ma Maison são visíveis e editáveis neste caso.

Todas as informações dos fornecedores podem ser visualizadas e editadas

Figura 9: Todas as informações dos fornecedores podem ser visualizadas e editadas (Clique para visualizar a imagem em tamanho real)

Apenas as informações do fornecedor selecionado podem ser visualizadas e editadas

Figura 10: Somente as informações do fornecedor selecionado podem ser visualizadas e editadas (Clique para visualizar a imagem em tamanho real)

Observação

Para este tutorial, os controlos DropDownList e DetailsView EnableViewState devem ser definidos como true (o padrão) porque as alterações das propriedades do DropDownList SelectedIndex e do DetailsView DataSourceID devem ser lembradas nos postbacks.

Etapa 4: Listando os produtos dos fornecedores em um GridView editável

Com o DetailsView concluído, nossa próxima etapa é incluir um GridView editável que lista os produtos fornecidos pelo fornecedor selecionado. Este GridView deve permitir edições apenas nos ProductName campos e QuantityPerUnit . Além disso, se o utilizador que visita a página for de um determinado fornecedor, só deve permitir atualizações aos produtos que não sejam descontinuados. Para conseguir isso, vamos primeiro adicionar uma sobrecarga ao método ProductsBLL da classe UpdateProducts que aceita apenas os campos ProductID, ProductName e QuantityPerUnit como entradas. Nós passamos por esse processo antes em vários tutoriais, então vamos apenas olhar para o código aqui, que deve ser adicionado a ProductsBLL:

[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, string quantityPerUnit, int productID)
{
    Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
    if (products.Count == 0)
        // no matching record found, return false
        return false;
    Northwind.ProductsRow product = products[0];
    product.ProductName = productName;
    if (quantityPerUnit == null)
        product.SetQuantityPerUnitNull();
    else
        product.QuantityPerUnit = quantityPerUnit;
    // Update the product record
    int rowsAffected = Adapter.Update(product);
    // Return true if precisely one row was updated, otherwise false
    return rowsAffected == 1;
}

Com essa sobrecarga criada, estamos prontos para adicionar o controle GridView e seu ObjectDataSource associado. Adicione um novo GridView à página, defina sua ID propriedade como ProductsBySupplier, e configure-o para usar um novo ObjectDataSource chamado ProductsBySupplierDataSource. Como queremos que este GridView liste esses produtos pelo fornecedor selecionado, use o ProductsBLL método de classe s GetProductsBySupplierID(supplierID) . Também mapeie o Update() método para a nova UpdateProduct sobrecarga que acabamos de criar.

Configure o ObjectDataSource para usar o método sobrecarregado UpdateProduct que foi recém-criado

Figura 11: Configurar o ObjectDataSource para usar a sobrecarga UpdateProduct a imagem em tamanho real)

Somos solicitados a selecionar a fonte do parâmetro para o GetProductsBySupplierID(supplierID) parâmetro de entrada do supplierID método. Como queremos mostrar os produtos para o fornecedor selecionado no DetailsView, use a SuppliersDetails propriedade s do controle DetailsView como a fonte do SelectedValue parâmetro.

Use a propriedade SelectedValue do SuppliersDetailsDetailsView como a fonte do parâmetro

Figura 12: Use a propriedade SuppliersDetails do DetailsView SelectedValue como fonte do parâmetro (Clique para visualizar a imagem em tamanho real)

Voltando ao GridView, remova todos os campos GridView, exceto ProductName, QuantityPerUnite Discontinued, marcando o Discontinued CheckBoxField como somente leitura. Além disso, marque a opção Ativar Edição na marca inteligente do GridView. Depois que essas alterações forem feitas, a marcação declarativa para GridView e ObjectDataSource deve ser semelhante à seguinte:

<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>

Tal como acontece com os nossos ObjectDataSources anteriores, a propriedade OldValuesParameterFormatString está definida como original_{0}, o que causará problemas ao tentar atualizar o nome ou a quantidade de um produto por unidade. Remova essa propriedade da sintaxe declarativa completamente ou defina-a como padrão, {0}.

Com essa configuração concluída, nossa página agora lista os produtos fornecidos pelo fornecedor selecionado no GridView (veja a Figura 13). Atualmente, o nome ou a quantidade de qualquer produto por unidade podem ser atualizados. No entanto, precisamos atualizar nossa lógica de página para que tal funcionalidade seja proibida para produtos descontinuados para usuários associados a um determinado fornecedor. Abordaremos esta peça final no Passo 5.

Os produtos fornecidos pelo fornecedor selecionado são exibidos

Figura 13: Os produtos fornecidos pelo fornecedor selecionado são exibidos (Clique para visualizar a imagem em tamanho real)

Observação

Com a adição desse GridView editável, o Suppliers manipulador de eventos DropDownList s SelectedIndexChanged deve ser atualizado para retornar o GridView a um estado somente leitura. Caso contrário, se um fornecedor diferente for selecionado no meio da edição de informações do produto, o índice correspondente no GridView para o novo fornecedor também será editável. Para evitar isso, basta definir a propriedade GridView s EditIndex como -1 no manipulador de SelectedIndexChanged eventos.

Além disso, lembre-se de que é importante que o estado de exibição de GridView esteja habilitado (o comportamento padrão). Se você definir a propriedade s EnableViewState de GridView como false, corre o risco de ter usuários simultâneos excluindo ou editando registros involuntariamente.

Etapa 5: Impedir a edição de produtos descontinuados quando mostrar/editar TODOS os fornecedores não estiver selecionado

Embora o ProductsBySupplier GridView seja totalmente funcional, ele atualmente concede muito acesso aos usuários que são de um determinado fornecedor. De acordo com as nossas regras de negócio, esses utilizadores não devem poder atualizar produtos descontinuados. Para impor isso, podemos ocultar (ou desabilitar) o botão Editar nessas linhas do GridView com produtos descontinuados quando a página está sendo visitada por um usuário de um fornecedor.

Crie um manipulador de eventos para o evento GridView RowDataBound . Neste manipulador de eventos, precisamos determinar se o usuário está ou não associado a um determinado fornecedor, o que, para este tutorial, pode ser determinado verificando a propriedade Suppliers DropDownList - SelectedValue se for algo diferente de -1, então o usuário está associado a um fornecedor específico. Para esses usuários, precisamos determinar se o produto é descontinuado ou não. Podemos obter uma referência à instância real ProductRow vinculada à linha GridView por meio da propriedade e.Row.DataItem, conforme discutido no tutorial Apresentando informações de resumo no Rodapé do GridView. Se o produto for descontinuado, podemos obter uma referência programática para o botão Editar no CommandField do GridView usando as técnicas discutidas no tutorial anterior, Adicionando Client-Side confirmação ao eliminar. Assim que tivermos uma referência, podemos ocultar ou desativar o botão.

protected void ProductsBySupplier_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Is this a supplier-specific user?
        if (Suppliers.SelectedValue != "-1")
        {
            // Get a reference to the ProductRow
            Northwind.ProductsRow product =
                (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
            // Is this product discontinued?
            if (product.Discontinued)
            {
                // Get a reference to the Edit LinkButton
                LinkButton editButton = (LinkButton)e.Row.Cells[0].Controls[0];
                // Hide the Edit button
                editButton.Visible = false;
            }
        }
    }
}

Com esse manipulador de eventos instalado, ao visitar esta página como um usuário de um fornecedor específico, os produtos que são descontinuados não são editáveis, pois o botão Editar está oculto para esses produtos. Por exemplo, o Gumbo Mix do Chef Anton é um produto descontinuado para o fornecedor New Orleans Cajun Delights. Ao visitar a página desse fornecedor específico, o botão Editar deste produto fica oculto (veja a Figura 14). No entanto, ao visitar usando o "Mostrar/editar todos os fornecedores", o botão Editar está disponível (veja a Figura 15).

Para usuários Supplier-Specific, o botão Editar para o Gumbo Mix do Chef Anton está oculto

Figura 14: Para usuários Supplier-Specific, o botão Editar para o Gumbo Mix do Chef Anton está oculto (Clique para visualizar a imagem em tamanho real)

Para mostrar/editar TODOS os usuários de fornecedores, o botão de edição para o Gumbo Mix do chef Anton é exibido

Figura 15: Para mostrar/editar TODOS os usuários de fornecedores, o botão Editar para o Gumbo Mix do Chef Anton é exibido (Clique para visualizar a imagem em tamanho real)

Verificando direitos de acesso na camada de lógica de negócios

Neste tutorial, a página ASP.NET lida com toda a lógica em relação às informações que o usuário pode ver e quais produtos ele pode atualizar. Idealmente, essa lógica também estaria presente na camada de lógica de negócios. Por exemplo, o SuppliersBLL método de classe s GetSuppliers() (que retorna todos os fornecedores) pode incluir uma verificação para garantir que o usuário conectado no momento não esteja associado a um fornecedor específico. Da mesma forma, o UpdateSupplierAddress método pode incluir uma verificação para garantir que o usuário conectado atualmente trabalhou para nossa empresa (e, portanto, pode atualizar todas as informações de endereço do fornecedor) ou está associado ao fornecedor cujos dados estão sendo atualizados.

Eu não incluí essas verificações de camada BLL aqui porque em nosso tutorial os direitos do usuário são determinados por um DropDownList na página, que as classes BLL não podem acessar. Ao usar o sistema de associação ou um dos esquemas de autenticação prontos para uso fornecidos pelo ASP.NET (como a autenticação do Windows), as informações do usuário conectado no momento e as informações de funções podem ser acessadas a partir da BLL, tornando assim essas verificações de direitos de acesso possíveis nas camadas de apresentação e BLL.

Resumo

A maioria dos sites que fornecem contas de usuário precisa personalizar a interface de modificação de dados com base no usuário conectado. Os utilizadores administrativos podem eliminar e editar qualquer registo, enquanto os utilizadores não administrativos podem limitar-se apenas a atualizar ou eliminar registos que eles próprios criaram. Seja qual for o cenário, os controles da Web de dados, ObjectDataSource e as classes Business Logic Layer podem ser estendidos para adicionar ou negar determinadas funcionalidades com base no usuário conectado. Neste tutorial, vimos como limitar os dados visíveis e editáveis dependendo se o usuário estava associado a um determinado fornecedor ou se eles trabalhavam para a nossa empresa.

Este tutorial conclui nosso exame de inserção, atualização e exclusão de dados usando os controles GridView, DetailsView e FormView. A partir do próximo tutorial, vamos direcionar a nossa atenção para adicionar suporte de paginação e ordenamento.

Feliz Programação!

Sobre o Autor

Scott Mitchell, autor de sete livros sobre ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias Web da Microsoft desde 1998. Scott trabalha como consultor, formador e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Ele pode ser contatado em mitchell@4GuysFromRolla.com.