如何使用Breeze JS处理授权?

时间:2013-11-24 19:47:05

标签: asp.net-web-api breeze

目前我的应用程序查看路由器参数并登录用户(Principal.Identity)以授权访问某些资源(例如:将学生添加到您的班级[identity + class id])。但是,如果我没错,breeze js只支持一次批量保存。似乎我必须打开每个数据并运行验证/授权。没关系,

但我可能失去的是将交叉问题分离出我的业务逻辑(作为消息处理程序)(找到用户在类中具有什么角色)和良好的Authroize注释功能(仅说明什么角色是需要)。那么我是否需要进行权衡,或者Breeze JS可能会提出更好的编程模型吗?

更新 我的问题更多的是如何从业务或数据访问逻辑中分离授权(在消息处理程序中查找分配的角色+验证是否存在通过向控制器方法添加authorize属性所需的角色)逻辑。如果没有微风,我将检查传入消息及其路由参数以获取其所有角色,然后在我将使用所需角色注释的put / post / delete方法中。我不能在微风中使用这种技术(它不是微风的限制,当你进行批量保存时它的权衡)。所以想知道微风家伙是否已经使用过任何编程模型或设计模式。在breeze的样本上有一些东西是覆盖上下文并使用存储库模式,现在将遵循这一点。

3 个答案:

答案 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只支持一次批量保存。

这是完全错误的。你有自由的统治来创建自己的保存方法。阅读文档,就在那里。