0

私は RavenDB をかなりいじっていて、認可バンドルを使用して権限を制御したいと考えています。ただし、複雑なコード (ビジネス ロジックが重いため複雑) を再利用可能なチャンクに構成し、承認をそのまま維持する最善の方法を判断するのに苦労しています。

複雑なコードの場合、コードを再利用できるように、それらを共通のメソッド セットに引き出しました。これらの各メソッドは、大まかに 1 つの承認操作にマップされ、メソッド自体が独自の操作を実行します。session.SecureFor

ただしsession.SecureFor、セッション レベルで適用され、SecureForSaveChanges の前に行われた最後の呼び出しのみが適用されるようです。

例えば

    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 つの異なるセッションを開く必要がありますか? ...または私はこれに完全に間違ってアプローチしています

4

1 に答える 1

0

Authバンドルは、サーバー呼び出しごとに1つの操作を許可することを目的としています。ストアはサーバーに移動しません。そのため、最後の操作のみがサーバーに表示されます。SaveChanges()が呼び出された場合にのみ、それがわかります。

于 2012-11-22T09:19:58.203 に答える