10


6

行レベルセキュリティをEntity Frameworkで実装する方法を検討しようとしています。 その目的は、ObjectContextから来る行を制限するためのメソッドを提供するデータベースにとらわれない手段を持つことです。

私の最初のアイデアのいくつかは、EDMGENツールによって作成された部分クラスを変更することを含み、それはいくつかの限られたサポートを提供しました。 ユーザーは、自分のeSQLステートメントとQueryObjectを使用してこの解決策を回避することができます。

私はデータベースプロバイダの上に存在する包括的な解決策を探してきました。

5 Answer


10


もちろんできます。 重要なことは、オブジェクトコンテキストへの直接アクセスをブロックし(ユーザーが独自のObjectQueryを構築できないようにする)、代わりにエンティティにアクセスして変更するための狭いゲートウェイをクライアントに提供することです。 これは、http://www.martinfowler.com/eaaCatalog/repository.html [エンティティリポジトリパターン]で行います。 あなたは エンティティフレームワークのためのこのパターンの実装例をこのブログ記事で見つけることができます。 繰り返しますが、このキーはオブジェクトコンテキストへのアクセスをブロックしています。 オブジェクトコンテキストクラスは部分的なものです。 それで、あなたはそれをインスタンス化する「無許可の」手段、すなわちあなたのリポジトリアセンブリの外側を防ぐことができるはずです。

しかし、考慮すべき微妙な点があります。 リポジトリパターンを介して特定のエンティティタイプに行レベルのビューセキュリティを実装する場合は、クライアントが同じエンティティにアクセスするための他の手段を検討する必要があります。 たとえば、ナビゲーション関係を介して。 これらの関係のいくつかをプライベートにする必要があるかもしれません。それはあなたのモデルの中で可能です。 カスタムクエリの指定またはストアドプロシージャのオプションもありますエンティティのロード/保存用。 ストアドプロシージャはDBサーバー固有のものになる傾向がありますが、SQLは一般的な方法で書くことができます。

Entity Frameworkではこれができないことに同意しませんが、http://en.wikipedia.org/wiki/Defense_in_Depth_(computingを実装する必要がある限り、 "do it on the DB server"というコメントに同意します。 )[徹底的な防御]


2


セキュリティを追加する場所は、誰がセキュリティをかけようとしているかによって異なります。

たとえば、Webサイトを保護している場合は、コンテキストレベルでフィルタリングを追加すれば十分です。この場合の「ユーザー」はWebサイトにいるためです。 あなたは完全にコンテキストに反してアプリケーションを書くだろうから、それらはあなたのコンテキストを通過する以外に選択肢がない。

あなたの場合、それはあなたがセキュリティで保護しようとしている「ユーザー」が開発者であるように聞こえます。 それはもう少し難しいです。 開発者がデータベース自体を変更するためのアクセス権を持っていない場合は、データベースレベルでセキュリティを強化する必要があります。 "no"と言ってデータベースを回避することはできません。


1


あなたが達成しようとしていることは、定義上、不可能です。

基礎となるデータベースアプリケーション(SQL Server、Oracleなど)によってセキュリティが明示的に処理されない場合は、SQL Management Studioなどの標準ツールで問題が解決されます。

最善の方法は、アプリケーションのユーザーが行レベルのセキュリティーをそれらのユーザーが別のメカニズムを介してデータベースにアクセスできない場合にのみ適用することです。


1


この記事は役に立ちますか。

「反論を引き起こさずにEntity Frameworkへのテーブルアクセスを拒否する」


0


私はPostgresとhttp://veil.projects.pgfoundry.org/curdocs/[Veil]という拡張子を使ってそれを行う方法を見つけました。 これは実際にはすべての操作(select、update、delete、insert)に対して Views`を使い、 WHERE`句の中でパーミッションを検証するために(のために)設計されています。 しかしVeilは、毎回照会するのではなく、メモリ内の許可の情報を効率的に管理するための数学を追加しただけです。 そのため、VeilではDBMSに直接接続していますが、行レベルのアクセス権しか与えられていません。

私はいくつかの方法で私のスタイルをveilで修正します、例えば、私はパーミッション制限を適用するために Views`の代わりに Triggers`を使い始めました。

私はあなたがこの解決策を勉強して、それをここに論理を適用することを試みることを勧めます。

つまり、 `select * from table`クエリを実行すると、意図したとおりの結果が得られます(行レベルでの会話)。