2017-07-05 17 views
2

私のアプリケーションには2つの役割(adminnormal)があります。モデルでは私はクラス(例)を持っています:プロパティの一部への安全なアクセス

public class Foo 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Extra { get; set; } 
} 

ユーザーは、そのオブジェクトを編集して検索することもできます。アプリケーションは、WebAPI ASP.NET Core with EF Coreに基づいています。

normalは、属性が表示されないようにしてください(または何もしないでください)。Extraプロパティが必要です。モデルクラス(または何か他のもの)を分割するか、プロパティを無視してエンドポイントの出力をフォーマットするだけで、アプリケーション(サービス、コントローラ、データアクセス層)のあらゆる場所でデータを保護する必要がありますか?

私の考えの1つは、属性をExtraプロパティに設定してから、ContractResolverを使用して、ユーザーがそのプロパティを表示する資格がないときにその属性でプロパティを無視することです。また、EFチェンジトラッカーを変更して、そのプロパティの保存を無視します(同じ場合)。

この問題を処理する方法や戦略はありますか?

+0

を使用すると、複数のクラスに出て自分のクラスを抽象化する必要があるような音。 – maccettura

答えて

0

これはあまりに細かいため、このためのメカニズムはありません。また、EFレベルでこれを強制しようとすると、あなたのDALにHttpContextが漏れることになります。これは、いくつかの理由で悪い考えです。

私は、継承でモデル化することをお勧めします。言い換えれば、のようなものを作成:あなたのバッキングテーブルはかなりまったく同じになりますので、デフォルトでは

public class Foo 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public class ExtraFoo : Foo 
{ 
    public string Extra { get; set; } 
} 

を、Entity Frameworkのは、単一テーブル継承を経てこれを実装します。ただし、これにより、一方または他方で別々に作業することができます。

次に、各タイプの作業には完全に別々のコントローラやアクションを使用することをお勧めします。これにより、それぞれに対して異なる権限を使用することができ、「通常の」ユーザーはFooExtraFooではなく)でしか作業できなくなります。これが示唆する明白な重複を否定するには、各タイプ固有のコントローラは、その後から継承できジェネリック利用ベースコントローラ採用することができます。

public class BaseFooController<TFoo> : Controller 
    where TFoo : Foo, new() 
{ 
    // all your actions here, utilizing generic type, e.g.: 

    [HttpPost] 
    public ActionResult Create(TFoo foo) 
    { 
     ... 
    } 
} 

[Authorize(Roles = "normal")] 
public class FooController : BaseFooController<Foo> 
{ 
} 

[Authorize(Roles = "admin")] 
public class ExtraFooController : BaseFooController<ExtraFoo> 
{ 
} 
+0

私は 'Foo'が別々に存在することができないので、モデルクラスを2つに分割することを避けようとしています。それぞれのオブジェクトは 'ExtraFoo'型を持ち、' ​​Foo'はそのオブジェクトのビューの一種です。インターフェイスを使用することをお勧めしますか? – Gullard

関連する問題