目前我的应用程序查看路由器参数并登录用户(Principal.Identity)以授权访问某些资源(例如:将学生添加到您的班级[identity + class id])。但是,如果我没错,breeze js只支持一次批量保存。似乎我必须打开每个数据并运行验证/授权。没关系,
但我可能失去的是将交叉问题分离出我的业务逻辑(作为消息处理程序)(找到用户在类中具有什么角色)和良好的Authroize注释功能(仅说明什么角色是需要)。那么我是否需要进行权衡,或者Breeze JS可能会提出更好的编程模型吗?
更新 我的问题更多的是如何从业务或数据访问逻辑中分离授权(在消息处理程序中查找分配的角色+验证是否存在通过向控制器方法添加authorize属性所需的角色)逻辑。如果没有微风,我将检查传入消息及其路由参数以获取其所有角色,然后在我将使用所需角色注释的put / post / delete方法中。我不能在微风中使用这种技术(它不是微风的限制,当你进行批量保存时它的权衡)。所以想知道微风家伙是否已经使用过任何编程模型或设计模式。在breeze的样本上有一些东西是覆盖上下文并使用存储库模式,现在将遵循这一点。
答案 0 :(得分:1)
Breeze可以根据需要设置尽可能多的“保存”端点。例如,假设的服务器实现可能是
[BreezeController]
public class MyController : ApiController {
[HttpPost]
[Authorize(...)]
public SaveResult SaveCustomersAndOrders(JObject saveBundle) {
// CheckCustomersAndOrders would be a custom method that validates your data
ContextProvider.BeforeSaveEntitiesDelegate = CheckCustomerAndOrders;
return ContextProvider.SaveChanges(saveBundle);
}
[HttpPost]
[Authorize]
public SaveResult SaveSuppliersAndProducts(JObject saveBundle) {
...
}
您可以像这样调用这些端点
var so = new SaveOptions({resourceName:“SaveWithFreight2”,tag:“freight update”});
myEntityManager.saveChanges(customerAndOrderEntities, {
resourceName: "SaveCustomersAndOrder" }
).then(...)
或
myEntityManager.saveChanges(supplierAndProductEntities, {
resourceName: "SaveSuppliersAndProducts" }
).then(...)
授权通过每个[HttpPost]方法的[Authorize]属性进行调解。您可以在此处详细了解[授权]属性: http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/
答案 1 :(得分:1)
执行此操作的正确方法是将端点授权与数据库操作授权分开。
首先,创建一个管理每个控制器/方法和角色的Grands的实体。对于每种方法,您都允许使用值 - 不允许使用特定角色。您创建一个特殊属性(Authorize的子类),您应用于控制器(breeze或plain web api),它读取数据并决定是否可以为用户/角色调用特定端点。否则会抛出Unauthorized异常。
在微风方面(客户端),您使用一种方法扩展默认适配器设置,该方法会添加您在登录时收到的身份的身份验证标头,如下所示:
var origAjaxCtor = breeze.config.getAdapterInstance(' ajax');
$ .extend(true,origAjaxCtor.defaultSettings,Security.getAuthenticationHeaders());
在服务器上,添加管理CRUD操作授权的第二个实体。您需要一个像(EntityName,AllowInsert,AllowUpdate,AllowDelete)这样的表。在Context Manager上或在循环所有实体的ORM(EF或其他)上添加BeforeSave事件,并应用上表中指定的策略。 这样,您可以清楚地将端点逻辑与后端CRUD逻辑分开。
在所有情况下,授权逻辑应首先在服务器端实现,如果需要,应推送到客户端。
实现breeze的方式,使用上述设计,您不需要超过1个保存端点。
希望它有所帮助。
答案 2 :(得分:0)
但是,如果我没错,breeze js只支持一次批量保存。
这是完全错误的。你有自由的统治来创建自己的保存方法。阅读文档,就在那里。