データベースの各テーブルに「tenant_id」列があるマルチテナント データベースがあります。RESTier を使用して、このデータベース上で OData サービスを公開したいと考えています。サービスへの各要求には、どのテナントのデータがアクセスされているかを示すクレームを含む JWT が含まれます。返されたレコードを受信テナントのレコードのみにフィルターするにはどうすればよいですか?
http://odata.github.io/RESTierのドキュメントを読むと、「エンティティ セット フィルター」機能は、この正確なシナリオ シナリオを解決することを目的としているように見えます。したがって、着信 JWT から tenant_id を抽出して現在のクレーム プリンシパルを確立できると仮定すると、次のようなことができるはずです。
private IQueryable<customer> OnFilterCustomers(IQueryable<customer> customers)
{
var principal = ClaimsPrincipal.Current;
var tenantId = principal.Claims.FirstOrDefault(c => c.Type == "tenantid").Value;
return customers.Where(c => c.tenant_id == tenantId);
}
これは、この作業を行うのに最適な場所ですか? 承認リクエスト ヘッダーに基づいて行レベル フィルターを実行する例はありますか?
また、edm から tenant_id 列を非表示にしたいのですが、それを行うメカニズムはありますか?