2016-10-14 13 views
4

私のチームはJAX-RSでRESTfulなAPIを設計しており、認証された "オペレータ"のIDに基づいてデータベース内の特定の行の可用性を制限する必要があります"(ユーザーのための私達の言葉)。言い換えれば、事業者は、その管轄下にある事業体にのみアクセスできる必要があります。各リクエストの開始時に、オペレーターの認証を行い、オペレーターの役割とIDに基づいてセキュリティー機能を提供できるようにします。MS SQLを使用したJAX-RSの行レベルのセキュリティ

エンドポイント、エンドポイントメソッド、エンティティコンテンツ(シリアル化されるもの)さえもかなり簡単ですが、行レベルの認可は大きな髪の毛のようです。

ではなく、で、Springを使用しており、Spring Securityをプロジェクトで使用する予定はありません。

私たちはいくつかの潜在的な解決策を思いつきましたが、どれが最良かはわかりません。私たちが考慮していない解決策があることも非常に可能です。私はこの時点で何かを開いている。

  1. データベースレベルの実装を(this postで説明したように):ここでは、これまで持っているものです。これはおそらく、要求のセキュリティコンテキストを使用して、各要求時にオペレーターのIDをデータベースに渡すことを伴います。私はこのアプローチの実装の詳細については不明です。これが行レベルのセキュリティを実行する最善の方法であるなら、私はいくつかのアドバイスをいただければ幸いです。たとえば、エンティティの取得ではこれがどのように機能するのかがわかりますが、新しく作成または更新されたエンティティの行レベルのアクセス許可を変更するにはどうすればよいでしょうか?
  2. JPAレベルの実装(2008年のthis postで議論されているように)。これには、要求を行っている演算子のIDを入力するためのパラメータ化されたHibernateフィルタを生成する必要があります。私はHibernateフィルタを使用したことがないので、このアイデアは基本的ではない可能性があります。
  3. ファサードレベルの実装。最近までオプション(1)と(2)を認識していなかったので、実際にはこの考え方にかなりの考えを与えました。これは、指定された演算子がアクセス可能なエンティティのみを含むようにクエリを制限するCriteria API述語を構築するために、テーブル間の結合を実行することを含みます。これは本質的に私が理解している限り、「手動」アプローチであり、理想からは遠く離れているようです。

JAX-RSやデータベースセキュリティに精通している人なら、このすべてのことを理解することができたらすばらしいことでしょう。

ここでプロジェクト(少なくとも限り、この問題に関連するもの)のために、当社の技術スタックです:

  • データベース:MS SQL
  • JPAプロバイダ
  • JAXをHibernateは-RS実装:RESTEasy
+1

SQL Server 2016を使用していない限り、行レベルのセキュリティを実装する方法としてDBをマークすることができます。行レベルのセキュリティ(RLS)は行レベルでセキュリティを提供する概念ですアプリケーション層ではなく、データベース層内に存在します。 RLSは、SQL Server 2016でロールアウトされる機能と新しいセキュリティポリシー機能を使用して実現されます。 –

+0

なぜ、行レベルのセキュリティが必要ですか? –

+0

SQL Server 2016をオプションで使用していますか? –

答えて

1

SQLを使用するサーバー2016:行レベルセキュリティ(RLS)は、アプリケーション層ではなく、データベース層内の行レベルでセキュリティを提供する概念です。 RLSは、SQL Server 2016でロールアウトされる機能と新しいセキュリティポリシー機能を使用して実行されます。(実際に行レベルのセキュリティが必要な場合)

+0

アプリケーション層で行/エンティティレベルのセキュリティを実装するよりも、これが優れたアプローチである理由はありますか? –

関連する問題