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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

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

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

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

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

始めましょう。

注意

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

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

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

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

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

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

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

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

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

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

図 4: および データ フィールドをSuppliers使用CompanyNameSupplierIDするように DropDownList を構成する (クリックするとフルサイズの画像が表示されます)

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

注意

Databound DropDownList に [すべて選択] 項目を追加する方法の詳細については、「 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 は、ブラウザーで表示された現在の進行状況のスクリーン ショットを示しています。

仕入先 DropDownList には、すべての ListItem の表示と各仕入先の 1 つが含まれています

図 5: Suppliers DropDownList には、各サプライヤーの Show ALL ListItem、Plus One が含まれています (フルサイズの画像を表示する をクリックします)

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

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

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

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

注意

DetailsView のスマート タグに [編集を有効にする] オプションが表示されない場合は、ObjectDataSource s メソッドをクラスの Update()UpdateSupplierAddress メソッドにSuppliersBLLマップしていないためです。 少し時間を取って戻り、この構成を変更すると、DetailsView のスマート タグに [編集を有効にする] オプションが表示されます。

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

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

<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 をページングし、DropDownList で選択した内容に関係なく、選択した仕入先の住所情報を Suppliers 更新できます (図 6 を参照)。

すべてのサプライヤー情報を表示し、その住所を更新できます

図 6: すべての仕入先情報を表示でき、その住所が更新されました (クリックするとフルサイズの画像が表示されます)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

注意

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

手順 4: 編集可能な GridView に仕入先製品を一覧表示する

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

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

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

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

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

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

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

GridView に戻り、および を除くProductNameQuantityPerUnitすべての GridView フィールドを削除しDiscontinued、CheckBoxField をDiscontinued読み取り専用としてマークします。 また、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 プロパティを SelectedIndexChanged-1設定するだけです。

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

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

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

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

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

このイベント ハンドラーを設定すると、特定のサプライヤーのユーザーとしてこのページにアクセスすると、これらの製品の [編集] ボタンが非表示になっているので、廃止された製品は編集できません。 たとえば、Chef Anton s Gumbo Mix は、ニューオーリンズ の Cajun Delights サプライヤー向けに廃止された製品です。 この特定のサプライヤーのページにアクセスすると、この製品の [編集] ボタンが非表示になります (図 14 を参照)。 ただし、[すべての仕入先の表示/編集] を使用してアクセスする場合は、[編集] ボタンを使用できます (図 15 を参照)。

Supplier-Specific ユーザーの場合、シェフアントンのガンボミックスの編集ボタンは非表示です

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

すべてのサプライヤーユーザーを表示/編集するには、シェフアントンのガンボミックスの編集ボタンが表示されます

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

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

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

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

まとめ

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

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

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。