RavenDBs授权包中单个会话中的多个操作

时间:2012-11-21 19:04:21

标签: ravendb

我一直在玩RavenDB,并希望使用授权包来控制权限。但是,我无法确定将复杂代码(在业务逻辑中很复杂)组合成可重用块的最佳方法,同时保持授权不变。

对于复杂的代码,我已将它们拉出到一组通用的方法中,以便可以重用代码。这些方法中的每一个都粗略地映射到一个授权操作,并且该方法本身执行其自己的session.SecureFor

但是,session.SecureFor似乎适用于会话级别,并且仅适用于在SaveChanges之前进行的最后一次SecureFor调用。

例如

    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);
    }

在上面的代码中,如果Howser博士有权住院而不是ScheduleAppointment,那么这段代码仍然会成功,并且患者会安排预约 - 这是因为Hospitlize已经覆盖了安排约会的任何权限要求

每个会话只允许一次操作吗?如果我想执行两个单独的操作,我是否必须打开两个不同的会话? ......或者我正在接近这个完全错误的

1 个答案:

答案 0 :(得分:0)

Auth软件包意味着每个服务器调用允许一个操作,是的。 商店不会去服务器,这就是为什么你只看到最后一个操作的原因。 只有在调用SaveChanges()时才会看到。