2013-11-24 74 views
3

目前我的應用程序查看路由器參數並登錄用戶(Principal.Identity)來授權訪問某些資源(例如:將學生添加到您的班級[標識+班級ID])。但是,如果我沒有錯,微風js只支持一次批量保存。這似乎是我將不得不打開每一個數據並通過驗證/授權運行。這很好,如何使用Breeze JS處理授權?

但是我可能會失去的是交叉切割關心我的業務邏輯(作爲消息處理程序)(找到用戶對類的角色)和良好的Authroize註釋功能(只是說需要什麼樣的角色)。所以我必須權衡一下,還是有更好的Breeze JS可能提出的編程模型?

更新: 我的問題是更多的關於如何分離授權(發現在消息處理程序分配的角色+驗證,如果所需的角色是通過加入授權屬性到控制器的方法)從業務或數據訪問邏輯的邏輯。如果沒有風,我會檢查傳入的消息及其路由參數,以獲取其所有角色,然後在我的put/post/delete方法中使用所需的角色進行註釋。我不能輕而易舉地使用這種技術(它不是輕而易舉的限制,當你進行批量保存時它的折衷)。所以想知道是否有任何編程模型或設計模式已被微風傢伙使用。微風的樣本上有一些重寫上下文和使用存儲庫模式的東西,現在會遵循這一點。

回答

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所以=新SaveOptions({資源名稱: 「SaveWithFreight2」,標籤: 「運費更新」});

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/

+0

Thx爲詳細的答案。在我的情況下,我需要在授權消息處理程序的URL中提供所有可用角色的值,角色提取還取決於操作,如果更新/刪除/添加,因爲每個角色都有自己的角色,而客戶端可能有一個角色不是其他(可以更新但不能添加/刪除)。根據我的理解,我可能不得不根據EntityState獲取角色,並在不使用[Authorize]屬性的情況下手動驗證它們。 –

0

但是,如果我沒有錯,微風js只支持一個批量保存。

這是完全錯誤的。你可以自由創造你自己的保存方法。閱讀文檔,它就在那裏。

1

做到這一點的正確方法是分離端點授權和數據庫操作授權。

首先,創建一個管理每個控制器/方法和角色的實體。對於每種方法,您都有一個允許值 - 不允許用於特定角色。您可以創建一個特殊的屬性(Authorize的子類),並將其應用於控制器(breeze或plain web api),該控制器讀取數據並確定是否可以爲用戶/角色調用特定的端點。否則,它會拋出未經授權的異常。

在微風中端(客戶端)您擴展與從您在登錄時收到的,像這樣的身份將認證報頭的方法默認適配器設置:

VAR origAjaxCtor = breeze.config.getAdapterInstance( 'AJAX');

$ .extend(true,origAjaxCtor.defaultSettings,Security.getAuthenticationHeaders());

在服務器上,添加管理CRUD操作授權的第二個實體。您需要一個表(如EntityName,AllowInsert,AllowUpdate,AllowDelete)。在上下文管理器或ORM(EF或其他)上添加一個BeforeSave事件,該事件循環所有實體並應用上表中指定的策略。 通過這種方式,您可以將端點邏輯與後端CRUD邏輯清楚地分離。

在所有情況下,授權邏輯首先應該在服務器端實現,如果需要的話應該推送給客戶端。

微風的實施方式和上述設計,你不應該需要超過1個保存端點。

希望它有幫助。

+0

我真的很想理解你的答案,因爲我試圖在微風應用程序中實現安全性。而且,我認爲我瞭解'在服務器上'的部分。這是關於確保保存訪問權限,並且我實施了類似於您所描述的內容。但是,我沒有得到前面的部分。我想你正在描述如何根據角色限制對端點的訪問。但問題是無限制的微風查詢端點可能會傳遞請求(相關)受限數據的odata查詢(來自惡意客戶端)。我如何防止這種情況發生? – steve

+0

應限制所有端點。授權屬性應該應用於基礎控制器(我強烈建議您有一個基類)。通過這種方式,所有端點都將得到保護。我今天晚些時候會發布一些代碼來展示它如何實現 –

+0

我們在控制器類上使用了authorize屬性。我對'限制'和'不受限制'的使用是WRT基於角色的訪問。 – steve

相關問題