2

私のデータベースは次のようになります。

[テーブル] UserProfile

  • ユーザー名

【表】カテゴリー

  • カテゴリ ID (PK)
  • UserName (UserProfile へのリンク - これはレコードの所有者です)
  • ProductID (製品テーブル関連レコードへの外部キー)

【表】製品

  • 製品 ID (PK)
  • CategoryId (ナビゲーション プロパティ)

ログオンしたユーザーは、自分が所有するカテゴリーと製品のみを編集できます。コントローラーがビューから受け取った User.Identity.Name と CategoryID に基づいて、Category をルックアップするだけで十分です。レコードが返されない場合は、レコードが存在しないか、ユーザーが所有していません。それ。これは最善の方法ではないと思い始めましたが、うまくいきます...

私の質問は、製品に関するこの種のチェックを処理する最善の方法に関するものですか?

  1. ProductId へのナビゲーション プロパティを使用してUserName値を取得するクエリを作成する必要がありますか?
  2. これは、コントローラーの linq クエリまたは Products クラスのメソッドで行う必要がありますか? すなわちprod.ConfirmOwnerIs(User.Identity.Name)
  3. これは のような外部ヘルパー メソッドにする必要がありHelpers.ConfirmUserCanEditObject(prod, User.Identity.Name)ますか?

この例は少し単純化されており、実際のデータ モデルは数層の深さです。これは私にとって学習プロジェクトなので、不必要に、または非効率的な方法で DB にアクセスしたり、保守やテストが面倒になったりすることを避けようとしています。ここで何らかのガイダンスと知恵を期待しています。ありがとう。

4

2 に答える 2

1

優れたセキュリティが必要な場合は、オブジェクトとコントローラーの両方で実行します。オブジェクトは致命的な例外をスローするだけですが、コントローラーは、ユーザー インターフェイスがユーザーが例外が発生する状況に陥ることを決して許可しないようにする必要があります。投げられる。

基本的に、適切なセキュリティはシンプルである必要があります。「xxx パーミッションはありますか?」という 2 つのステートメントである必要があります。そして「さっさと死ね」。

これはユーザーフレンドリーではないため、物事を適切に処理するために複雑なコントローラーコードも入れますが、これはセキュリティシステムの一部と見なすべきではありません。

于 2013-04-29T00:57:17.183 に答える