我一直在玩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已经覆盖了安排约会的任何权限要求
每个会话只允许一次操作吗?如果我想执行两个单独的操作,我是否必须打开两个不同的会话? ......或者我正在接近这个完全错误的
答案 0 :(得分:0)
Auth软件包意味着每个服务器调用允许一个操作,是的。 商店不会去服务器,这就是为什么你只看到最后一个操作的原因。 只有在调用SaveChanges()时才会看到。