次の方法で共有


ユーザーに基づいてデータ編集機能を制限する (C#)

スコット・ミッチェル著

PDF をダウンロードする

ユーザーがデータを編集できる Web アプリケーションでは、異なるユーザー アカウントに異なるデータ編集権限がある場合があります。 このチュートリアルでは、アクセスするユーザーに基づいてデータ変更機能を動的に調整する方法について説明します。

イントロダクション

多くの Web アプリケーションは、ユーザー アカウントをサポートし、ログインしているユーザーに基づいてさまざまなオプション、レポート、機能を提供します。 たとえば、チュートリアルでは、サプライヤー企業のユーザーがサイトにログオンし、製品に関する一般的な情報 (ユニットごとの名前と数量など) と、会社名、住所、連絡先の情報などのサプライヤー情報を更新できるようにする場合があります。 さらに、当社のスタッフがログインして在庫単位や再注文レベルなどの製品情報を更新できるようにするため、社員用のユーザーアカウントをいくつか含めたいと考えています。 Web アプリケーションでは、匿名ユーザー (ログオンしていないユーザー) へのアクセスも許可される場合がありますが、データの表示のみに制限されます。 このようなユーザー アカウント システムが整ったので、ASP.NET ページのデータ Web コントロールで、現在ログオンしているユーザーに適した挿入、編集、削除の機能を提供する必要があります。

このチュートリアルでは、アクセスするユーザーに基づいてデータ変更機能を動的に調整する方法について説明します。 特に、編集可能な DetailsView にサプライヤー情報を表示するページと、サプライヤーが提供する製品を一覧表示する GridView を作成します。 このページにアクセスするユーザーが当社のユーザーである場合は、サプライヤーの情報を表示できます。自分のアドレスを編集する。サプライヤーが提供する製品の情報を編集します。 ただし、ユーザーが特定の会社のユーザーである場合は、自分の住所情報のみを表示および編集でき、廃止済みとしてマークされていない製品のみを編集できます。

当社のユーザーは、任意のサプライヤーの情報を編集することができます

図 1: 当社のユーザーは、任意のサプライヤーの情報を編集できます (フルサイズの画像を表示する をクリックします)。

特定のサプライヤーのユーザーは、自分の情報のみを表示および編集できます

図 2: 特定のサプライヤーのユーザーは、自分の情報のみを表示および編集できます (フルサイズの画像を表示する をクリックします)

では、始めましょう。

ASP.NET 2.0 のメンバーシップ システムは、ユーザー アカウントを作成、管理、検証するための標準化された拡張可能なプラットフォームを提供します。 メンバーシップシステムの検討はこれらのチュートリアルの範囲を超えているので、このチュートリアルでは、匿名の訪問者が特定のサプライヤーからのものか、私たちの会社からのものかを選択できるようにすることで、メンバーシップを"偽物"にします。 メンバーシップの詳細については、 2.0 ASP.NET メンバーシップ、ロール、プロファイル に関する記事シリーズを参照してください。

手順 1: ユーザーにアクセス権の指定を許可する

実際の Web アプリケーションでは、ユーザーのアカウント情報には、会社または特定のサプライヤーのどちらで作業したかが含まれます。この情報は、ユーザーがサイトにログオンした後、ASP.NET ページからプログラムでアクセスできます。 この情報は、ASP.NET 2.0 のロール システム、プロファイル システムを介したユーザー レベルのアカウント情報、または何らかのカスタム手段によってキャプチャできます。

このチュートリアルの目的は、ログオンしているユーザーに基づいてデータ変更機能を調整する方法を示すものであり、ASP.NET 2.0 のメンバーシップ、ロール、プロファイル システムを示すものではありません。そのため、非常に単純なメカニズムを使用して、ページにアクセスするユーザーの機能 (ユーザーがサプライヤー情報を表示および編集できるかどうかを示すことができる DropDownList) を決定します。 または、特定のサプライヤーの情報を表示および編集できます。 ユーザーが、すべてのサプライヤー情報 (既定値) を表示および編集できることを示した場合、すべてのサプライヤーをページングし、サプライヤーの住所情報を編集し、選択した仕入先から提供された製品の単位あたりの名前と数量を編集できます。 ただし、特定の仕入先のみを表示および編集できることをユーザーが示した場合、その 1 つの仕入先の詳細と製品のみを表示でき、廃止 されていない 製品の単位情報ごとの名前と数量のみを更新できます。

このチュートリアルの最初の手順は、この DropDownList を作成し、システム内のサプライヤーに設定することです。 UserLevelAccess.aspx フォルダーのEditInsertDelete ページを開き、ID プロパティが Suppliers に設定されている DropDownList を追加し、この DropDownList を AllSuppliersDataSource という名前の新しい ObjectDataSource にバインドします。

AllSuppliersDataSource という名前の新しい ObjectDataSource を作成する

図 3: AllSuppliersDataSource という名前の新しい ObjectDataSource を作成する (フルサイズの画像を表示する をクリックします)

この DropDownList にすべてのサプライヤーを含める必要があるため、 SuppliersBLL クラスの GetSuppliers() メソッドを呼び出すように ObjectDataSource を構成します。 また、この ObjectDataSource は手順 2 で追加する DetailsView でも使用されるため、ObjectDataSource の Update() メソッドが SuppliersBLL クラスの UpdateSupplierAddress メソッドにマップされていることを確認します。

ObjectDataSource ウィザードを完了したら、Suppliers データ フィールドが表示され、各CompanyNameの値として SupplierID データ フィールドが使用されるように、ListItem DropDownList を構成して手順を完了します。

CompanyName および SupplierID データ フィールドを使用するように Suppliers DropDownList を構成する

図 4: SuppliersCompanyNameデータ フィールドを使用するように SupplierID DropDownList を構成する (フルサイズの画像を表示する をクリックします)

この時点で、DropDownList には、データベース内の仕入先の会社名が一覧表示されます。 ただし、DropDownList に "すべての仕入先の表示/編集" オプションも含める必要があります。 これを行うには、Suppliers DropDownList の AppendDataBoundItems プロパティを true に設定し、ListItemを追加します。そのTextプロパティは「Show/Edit ALL Suppliers」で、値は-1です。 これは、宣言型マークアップまたはデザイナーを使用して直接追加できます。プロパティ ウィンドウに移動し、DropDownList の Items プロパティの省略記号をクリックします。

Databound DropDownList に Select All 項目を追加する方法の詳細については、「 Master/Detail Filtering With a DropDownList 」チュートリアルを参照してください。

AppendDataBoundItems プロパティが設定され、ListItemが追加されると、DropDownList の宣言型マークアップは次のようになります。

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

図 5 は、ブラウザーで表示したときの現在の進行状況のスクリーン ショットを示しています。

Suppliers DropDownList には、Show ALL ListItem と各サプライヤーの 1 つが含まれています

図 5: Suppliers DropDownList には、すべてを表示するListItemオプションと、各サプライヤーに対するオプションが含まれています (フルサイズの画像を見るにはクリックしてください)。

ユーザーが選択を変更した直後にユーザー インターフェイスを更新するため、 Suppliers DropDownList の AutoPostBack プロパティを true に設定します。 手順 2 では、DropDownList の選択に基づいて仕入先の情報を表示する DetailsView コントロールを作成します。 次に、手順 3 で、この DropDownList の SelectedIndexChanged イベントのイベント ハンドラーを作成します。このイベントでは、選択したサプライヤーに基づいて、適切なサプライヤー情報を DetailsView にバインドするコードを追加します。

手順 2: DetailsView コントロールを追加する

DetailsView を使用してサプライヤー情報を表示しましょう。 すべてのサプライヤーを表示および編集できるユーザーの場合、DetailsView ではページングがサポートされ、ユーザーは一度に 1 レコードずつサプライヤー情報をステップ実行できます。 ただし、ユーザーが特定のサプライヤーで作業している場合、DetailsView にはその特定のサプライヤーの情報のみが表示され、ページング インターフェイスは含まれません。 どちらの場合も、DetailsView では、ユーザーが仕入先の住所、市区町村、および国のフィールドを編集できるようにする必要があります。

Suppliers DropDownList の下のページに DetailsView を追加し、そのID プロパティをSupplierDetailsに設定し、前の手順で作成したAllSuppliersDataSource ObjectDataSource にバインドします。 次に、DetailsView のスマート タグの [ページングを有効にする] チェックボックスと [編集を有効にする] チェックボックスをオンにします。

DetailsView のスマート タグに [編集を有効にする] オプションが表示されない場合は、ObjectDataSource の Update() メソッドを SuppliersBLL クラスの UpdateSupplierAddress メソッドにマップしていないためです。 しばらく待ってから、この構成を変更します。その後、[編集を有効にする] オプションが DetailsView のスマート タグに表示されます。

SuppliersBLL クラスの UpdateSupplierAddress メソッドは、supplierIDaddresscitycountryの 4 つのパラメーターのみを受け入れるため、DetailsView の BoundFields を変更して、CompanyNamePhone BoundFields が読み取り専用になるようにします。 さらに、BoundField SupplierID を完全に削除します。 最後に、 AllSuppliersDataSource ObjectDataSource には現在、 OldValuesParameterFormatString プロパティが original_{0} に設定されています。 このプロパティ設定を宣言構文から完全に削除するか、既定値 ( {0}) に設定します。

SupplierDetails DetailsView と ObjectDataSource AllSuppliersDataSourceを構成すると、次の宣言型マークアップが作成されます。

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

この時点で、DetailsView をページングでき、選択した仕入先の住所情報は、 Suppliers DropDownList で行われた選択に関係なく更新できます (図 6 を参照)。

サプライヤー情報を表示し、その住所を更新

図 6: すべてのサプライヤー情報を表示でき、そのアドレスが更新されました (フルサイズの画像を表示する をクリックします)。

手順 3: 選択した仕入先の情報のみを表示する

現在、このページには、特定のサプライヤーが Suppliers DropDownList から選択されているかどうかに関係なく、すべてのサプライヤーの情報が表示されます。 選択したサプライヤーのサプライヤー情報のみを表示するには、特定のサプライヤーに関する情報を取得する別の ObjectDataSource をページに追加する必要があります。

新しい ObjectDataSource をページに追加し、 SingleSupplierDataSource名前を付けます。 スマート タグの [データ ソースの構成] リンクをクリックし、 SuppliersBLL クラスの GetSupplierBySupplierID(supplierID) メソッドを使用します。 AllSuppliersDataSource ObjectDataSource と同様に、SingleSupplierDataSource ObjectDataSource の Update() メソッドを SuppliersBLL クラスの UpdateSupplierAddress メソッドにマップします。

GetSupplierBySupplierID(supplierID) メソッドを使用するように SingleSupplierDataSource ObjectDataSource を構成する

図 7: SingleSupplierDataSource メソッドを使用するように GetSupplierBySupplierID(supplierID) ObjectDataSource を構成する (フルサイズの画像を表示する をクリックします)

次に、 GetSupplierBySupplierID(supplierID) メソッドの入力パラメーターのパラメーター ソース supplierID 指定するように求められます。 DropDownList から選択した仕入先の情報を表示するため、パラメーター ソースとして Suppliers DropDownList の SelectedValue プロパティを使用します。

supplierID パラメーター ソースとして Suppliers DropDownList を使用する

図 8: Suppliers DropDownList を supplierID パラメーター ソースとして使用する (フルサイズの画像を表示する をクリックします)

この 2 つ目の ObjectDataSource が追加された場合でも、DetailsView コントロールは現在、常に AllSuppliersDataSource ObjectDataSource を使用するように構成されています。 選択した Suppliers DropDownList 項目に応じて DetailsView で使用されるデータ ソースを調整するロジックを追加する必要があります。 これを実現するには、Suppliers DropDownList の SelectedIndexChanged イベント ハンドラーを作成します。 これを最も簡単に作成するには、デザイナーで DropDownList をダブルクリックします。 このイベント ハンドラーは、使用するデータ ソースを決定する必要があり、DetailsView にデータを再バインドする必要があります。 これを行うには、次のコードを使用します。

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();
}

イベント ハンドラーは、"Show/Edit ALL Suppliers" オプションが選択されているかどうかを判断することから始まります。 その場合は、 SupplierDetails DetailsView の DataSourceIDAllSuppliersDataSource に設定し、 PageIndex プロパティを 0 に設定して、ユーザーを仕入先セットの最初のレコードに返します。 ただし、ユーザーが DropDownList から特定のサプライヤーを選択した場合、DetailsView の DataSourceIDSingleSuppliersDataSourceに割り当てられます。 使用されているデータ ソースに関係なく、 SuppliersDetails モードは読み取り専用モードに戻り、 SuppliersDetails コントロールの DataBind() メソッドの呼び出しによってデータが DetailsView にリバインドされます。

このイベント ハンドラーが配置された状態で、DetailsView コントロールに選択された仕入先が表示されるようになりました。ただし、[Show/Edit ALL Suppliers]\(すべての仕入先の表示/編集\) オプションが選択されていない限り、すべてのサプライヤーをページング インターフェイスで表示できます。 図 9 は、[すべての仕入先の表示/編集] オプションが選択されているページを示しています。ページング インターフェイスが存在するため、ユーザーは任意のサプライヤーにアクセスして更新できます。 図 10 は、Ma Maison サプライヤーが選択されたページを示しています。 この場合、Ma Maison の情報のみが表示および編集できます。

すべてのサプライヤー情報を表示および編集できます

図 9: すべてのサプライヤー情報を表示および編集できます (フルサイズの画像を表示する をクリックします)。

選択した仕入先の情報のみを表示および編集できます

図 10: 選択した仕入先の情報のみを表示および編集できます (フルサイズの画像を表示する をクリックします)。

このチュートリアルでは、DropDownList と DetailsView の両方の EnableViewStatetrue (既定値) に設定する必要があります。これは、DropDownList SelectedIndex と DetailsView DataSourceID プロパティの変更をポストバック間で記憶する必要があるためです。

手順 4: 編集可能な GridView でサプライヤー製品を一覧表示する

DetailsView が完了したら、次の手順では、選択したサプライヤーから提供された製品を一覧表示する編集可能な GridView を含めます。 この GridView では、 ProductName フィールドと QuantityPerUnit フィールドのみを編集できます。 さらに、ページにアクセスするユーザーが特定のサプライヤーからのものである場合は、廃止 されていない 製品の更新のみを許可する必要があります。 これを実現するには、まず、ProductsBLLUpdateProducts、およびProductIDフィールドのみを入力として受け取るProductName クラスのQuantityPerUnit メソッドのオーバーロードを追加する必要があります。 多くのチュートリアルでこのプロセスを事前に実行したので、ここでコードを見てみましょう。このコードは、 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;
}

このオーバーロードを作成したら、GridView コントロールとそれに関連付けられている ObjectDataSource を追加する準備ができました。 新しい GridView をページに追加し、その ID プロパティを ProductsBySupplierに設定し、 ProductsBySupplierDataSourceという名前の新しい ObjectDataSource を使用するように構成します。 この GridView には、選択したサプライヤーがこれらの製品を一覧表示する必要があるため、 ProductsBLL クラスの GetProductsBySupplierID(supplierID) メソッドを使用します。 また、 Update() メソッドを、先ほど作成した新しい UpdateProduct オーバーロードにマップします。

作成した UpdateProduct オーバーロードを使用するように ObjectDataSource を構成する

図 11: 作成した UpdateProduct オーバーロードを使用するように ObjectDataSource を構成する (フルサイズの画像を表示する をクリックします)

GetProductsBySupplierID(supplierID) メソッドの入力パラメーターのパラメーター ソースsupplierID選択するように求められます。 DetailsView で選択した仕入先の製品を表示するため、パラメーター ソースとして SuppliersDetails DetailsView コントロールの SelectedValue プロパティを使用します。

SuppliersDetails DetailsView の SelectedValue プロパティをパラメーター ソースとして使用する

図 12: パラメーター ソースとして SuppliersDetails DetailsView s SelectedValue プロパティを使用します (フルサイズの画像を表示する をクリックします)。

GridView に戻り、 ProductNameQuantityPerUnitDiscontinuedを除くすべての GridView フィールドを削除し、 Discontinued CheckBoxField を読み取り専用としてマークします。 また、GridView のスマート タグから [編集を有効にする] オプションをオンにします。 これらの変更が行われた後、GridView と ObjectDataSource の宣言型マークアップは次のようになります。

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

前の ObjectDataSources と同様に、この 1 つの OldValuesParameterFormatString プロパティは original_{0} に設定されているため、ユニットあたりの製品名または数量を更新しようとすると問題が発生します。 宣言構文からこのプロパティを完全に削除するか、既定の {0}に設定します。

この構成が完了すると、このページには、GridView で選択されたサプライヤーによって提供された製品が一覧表示されます (図 13 を参照)。 現在 製品の名前またはユニットあたりの数量を更新できます。 ただし、特定のサプライヤーに関連付けられているユーザーの廃止された製品に対してこのような機能が禁止されるように、ページ ロジックを更新する必要があります。 手順 5 でこの最後の部分に取り組みます。

選択した仕入先から提供された製品が表示されます。

図 13: 選択したサプライヤーによって提供される製品が表示されます (フルサイズの画像を表示する をクリックします)。

この編集可能な GridView を追加すると、 Suppliers DropDownList の SelectedIndexChanged イベント ハンドラーを更新して、GridView を読み取り専用の状態に戻す必要があります。 それ以外の場合、製品情報の編集中に別のサプライヤーを選択した場合、新しいサプライヤーの GridView 内の対応するインデックスも編集可能になります。 これを回避するには、GridView の EditIndex プロパティを -1 イベント ハンドラーでSelectedIndexChangedするように設定するだけです。

また、GridView のビュー ステートを有効にすることが重要であることを思い出してください (既定の動作)。 GridView の EnableViewState プロパティを false に設定すると、同時実行ユーザーが意図せずにレコードを削除または編集するリスクが発生します。

手順 5: [すべての仕入先の表示/編集] が選択されていない場合に、廃止された製品の編集を禁止する

ProductsBySupplier GridView は完全に機能しますが、現在、特定のサプライヤーのユーザーに対するアクセス権が多すぎます。 当社のビジネスルールに従って、そのようなユーザーは廃止された製品を更新することはできません。 これを強制するために、サプライヤーからユーザーがページにアクセスしているときに、廃止された製品を含む GridView 行の [編集] ボタンを非表示 (または無効) にできます。

GridView の RowDataBound イベントのイベント ハンドラーを作成します。 このイベント ハンドラーでは、ユーザーが特定のサプライヤーに関連付けられているかどうかを判断する必要があります。このチュートリアルでは、Suppliers DropDownList の SelectedValue プロパティを確認することで判断できます。-1 以外の場合、ユーザーは特定のサプライヤーに関連付けられます。 このようなユーザーの場合は、製品が中止されたかどうかを判断する必要があります。 「GridView のProductRow」チュートリアルで説明されているように、e.Row.DataItem プロパティを使用して、GridView 行にバインドされた実際の インスタンスへの参照を取得できます。 製品が廃止された場合は、前のチュートリアル「削除時の確認の Client-Side 追加」で説明した手法を使用して、GridView の CommandField の [編集] ボタンへのプログラムによる参照を取得できます。 参照を取得したら、ボタンを非表示または無効にすることができます。

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

このイベント ハンドラーを配置すると、特定のサプライヤーのユーザーとしてこのページにアクセスすると、[編集] ボタンがこれらの製品に対して非表示になっているため、廃止された製品は編集できません。 例えば、シェフアントンズガンボミックスは、ニューオーリンズケイジャンディライトサプライヤーのための廃止された製品です。 この特定のサプライヤーのページにアクセスすると、この製品の [編集] ボタンが非表示になります (図 14 を参照)。 ただし、[Show/Edit ALL Suppliers]\(すべてのサプライヤーの表示/編集\) を使用してアクセスする場合は、[編集] ボタンを使用できます (図 15 を参照)。

Supplier-Specific ユーザーの場合、シェフのアントンズガンボミックスの編集ボタンが非表示になります

図 14: Supplier-Specific ユーザーの場合、Chef Anton s Gumbo Mix の [編集] ボタンが非表示になっている (フルサイズの画像を表示する をクリックします)

[Show/Edit ALL Suppliers Users]\(すべてのサプライヤー ユーザーの表示/編集\) の場合、Chef Antons Gumbo Mix の [編集] ボタンが表示されます

図 15: すべてのサプライヤー ユーザーの表示/編集の場合、Chef Anton s Gumbo Mix の [編集] ボタンが表示されます (フルサイズの画像を表示する をクリックします)。

ビジネス ロジック 層でのアクセス権の確認

このチュートリアルでは、ASP.NET ページは、ユーザーが表示できる情報と更新できる製品に関するすべてのロジックを処理します。 理想的には、このロジックはビジネス ロジック レイヤーにも存在します。 たとえば、 SuppliersBLL クラスの GetSuppliers() メソッド (すべてのサプライヤーを返します) には、現在ログオンしているユーザーが特定のサプライヤーに関連付 けられていない ことを確認するチェックが含まれている場合があります。 同様に、 UpdateSupplierAddress メソッドには、現在ログオンしているユーザーが会社で働いている (したがって、すべてのサプライヤーの住所情報を更新できる) か、データが更新されているサプライヤーに関連付けられていることを確認するチェックを含めることができます。

このチュートリアルでは、ユーザーの権限はページ上の DropDownList によって決定され、BLL クラスはアクセスできないため、ここではこのような BLL 層チェックを含めませんでした。 メンバーシップ システムまたは ASP.NET によって提供される既定の認証スキーム (Windows 認証など) を使用する場合、現在ログオンしているユーザーの情報とロール情報に BLL からアクセスできるため、プレゼンテーションレイヤーと BLL レイヤーの両方でこのようなアクセス権チェックが可能になります。

概要

ユーザー アカウントを提供するほとんどのサイトでは、ログインしているユーザーに基づいてデータ変更インターフェイスをカスタマイズする必要があります。 管理ユーザーは任意のレコードを削除および編集できますが、非管理ユーザーは自分で作成したレコードの更新または削除のみに制限される場合があります。 シナリオが何であれ、データ Web コントロール、ObjectDataSource、および Business Logic Layer クラスを拡張して、ログオンしているユーザーに基づいて特定の機能を追加または拒否できます。 このチュートリアルでは、ユーザーが特定のサプライヤーに関連付けられているかどうか、または会社で働いていたかどうかに応じて、表示および編集可能なデータを制限する方法について説明しました。

このチュートリアルでは、GridView、DetailsView、および FormView コントロールを使用したデータの挿入、更新、および削除の検討を終えます。 次のチュートリアルから始めて、ページングと並べ替えのサポートを追加することに注目します。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジを使用しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・セルフ ASP.NET 24時間で2.0です。 彼には mitchell@4GuysFromRolla.comで連絡できます。