2016-10-20 61 views
2

什麼是將業務邏輯基於消息的設計最佳實踐?(ServiceStack)在消息業務邏輯的基於位置的架構

進出口使用servicestack建立我的API。

The wiki顯示了在消息上放置RequiredRole屬性的示例,而不是處理它的服務。

在某種意義上這[RequiredRole]/[Authenticate]是附加到消息的業務邏輯/安全性。

具體的例子

說,例如,我想補充DeleteAddress消息:

public class DeleteAddress : IReturn<bool> 
{ 
    public int AddressId { get; set; } 
} 

但是這是正確保護我要檢查或者管理員角色,權限ManageAllAddresses或該AddressId鏈接給這個用戶(可能在會話中,也許是通過db調用)。

如何將我最好去呢?

命題

是下面的代碼很好的做法,如果是的話我將如何實現呢?

[RequiredRole("Admin")] 
[RequiredPermission("ManageAllAddresses ")] 
[RequiredAddressLinkedToAccount] 
public class DeleteAddress : IReturn<bool> 
{ 
    public int AddressId { get; set; } 
} 
+0

thx爲維基上陳舊文檔上的指針,我們將更新它們以匹配 – mythz

回答

1

ServiceStack的建議是讓你的ServiceModel免費的依賴,所以我們建議你來註釋服務實現類,而不是你可以註釋無論是在服務類適用於所有操作或對個人的方法來申請只是這次行動,如:

[RequiredRole("Admin")] 
public class AddressServices : Service 
{ 
    [RequiredPermission("ManageAllAddresses ")] 
    [RequiredAddressLinkedToAccount] 
    public object Any(DeleteAddress request) 
    { 
    } 
} 

請注意ServiceStack需要你的服務來回報參考類型,通常是響應DTO但也可以a string,例如:

public class DeleteAddress : IReturn<string> 
{ 
    public int AddressId { get; set; } 
} 
0

要完成這個問題。我可以創建請求過濾器並將其添加到服務中。

無論是從AuthenticateAttribute繼承或直接從RequestFilterAttribute。

public class RequiredAddressLinkedToAccount : AuthenticateAttribute 
{ 
    public RequiredRoleAttribute(ApplyTo applyTo) 
    { 
     this.ApplyTo = applyTo; 
     this.Priority = (int)RequestFilterPriority.RequiredRole; 
    } 



    public override void Execute(IRequest req, IResponse res, object requestDto) 
    { 
     var dto = requestDto as ILinkedToAccount; 
     var session = req.GetSession(); 
     if(dto.AccountId == session.Id) 
      return; //we dont want anything to be blocked if the account Id is there. 

     //Implement like RequireRoleAttribute 
     if (DoHtmlRedirectIfConfigured(req, res)) 
      return; 

     res.StatusCode = (int)HttpStatusCode.Forbidden; 
     res.StatusDescription = "Address does not belong to you"; 
     res.EndRequest(); 

    } 
}