私は RavenDB をかなりいじっていて、認可バンドルを使用して権限を制御したいと考えています。ただし、複雑なコード (ビジネス ロジックが重いため複雑) を再利用可能なチャンクに構成し、承認をそのまま維持する最善の方法を判断するのに苦労しています。
複雑なコードの場合、コードを再利用できるように、それらを共通のメソッド セットに引き出しました。これらの各メソッドは、大まかに 1 つの承認操作にマップされ、メソッド自体が独自の操作を実行します。session.SecureFor
ただしsession.SecureFor
、セッション レベルで適用され、SecureFor
SaveChanges の前に行われた最後の呼び出しのみが適用されるようです。
例えば
public void AuthorizeAndSchedule()
{
using (var session = store.OpenSession())
{
dynamic patient = new ExpandoObject();
session.Store(patient);
session.SetAuthorizationFor((object)patient, new DocumentAuthorization
{
Tags = {"Patient" }
});
ScheduleAppointment(session, "Authorization/Users/DrHowser", patient);
Hospitalize(session, "Authorization/Users/DrHowser", patient);
session.SaveChanges();
}
}
protected void Hospitalize(IDocumentSession session, string requester, dynamic patient)
{
session.SecureFor(requester, "Hospitalization/Authorize");
//assume other more complicated things are going on here
patient.HospitilizationAuthorized = true;
session.Store(patient);
}
protected void ScheduleAppointment(IDocumentSession session, string requester, dynamic patient)
{
session.SecureFor(requester, "Hospitalization/ScheduleAppointment");
//assume other more complicated things are going on here
patient.AppointmentScheduledFor = DateTime.Now.AddDays(1);
session.Store(patient);
}
上記のコードで、Dr Howser が Hospitalize の権限を持っているが ScheduleAppointment の権限を持っていない場合でも、このコードは成功し、患者は予約をスケジュールされます。
セッションごとに 1 つの操作しか許可されていませんか? 2 つの別々の操作を実行したい場合、2 つの異なるセッションを開く必要がありますか? ...または私はこれに完全に間違ってアプローチしています