2014-07-14 224 views
0

我一直在閱讀有關基於聲明的身份驗證,並且我理解將身份驗證,授權和業務層彼此分開是一種很好的做法。我們應該有一個驗證組件,一個檢查授權並與驗證者分開的組件,並且我們還有一個業務邏輯層。除了一部分外,所有這些都是有意義的。想象一下,我們有一種像YouTube這樣的產品的情況,但用戶只能看到他們訂閱的人的視頻,而訂閱需要批准。現在,這個單獨的授權組件如何決定是否允許獲取視頻而不訪問數據庫?這不是我們可以提出索賠的東西。唯一的方法是查看請求的視頻ID是否在允許的(訂閱的)視頻中。分離業務邏輯層和安全邏輯層

我應該將這些檢查放在業務邏輯或訪問授權組件中的數據庫中嗎?

感謝

+0

取決於它是否是業務規則,您可能確實將其放入您的業務邏輯中。 –

回答

0

使用依賴注入校長授權成分並不需要訪問該業務數據庫,委託了一個「是本公司經營授權」查詢的只是注入能力。所以在psuedocode;

class Authorization() 
{ 
    public enumCheckAccessResult IsAuthorized(IIdentity userIdentity, ISecurable itemToCheckForAccess IAuthorizationExtension extension) 
    { 
      enumCheckAccessResult result = checkMyLocalAuthorisationStore(userIdentity, itemToCheckForAccess); 
      if(result == enumAccessCheckResult.SecurableNotFound) 
      { 
       result = extension.CheckExternalAuthorisationStore(userIdentity, itemToCheckForAccess) 
      } 
    } 
} 

以我的僞代碼的授權類接受一個I​​AuthorizationExtension實例,其可通過授權類的任何消費者提供的擴展點(dependeny注射)。請注意,如果我們的本地商店無法找到可安全(即要安全檢查的項目),那麼我們只使用此擴展,所以IAuthorisationExtension的作者不能覆蓋我的授權類的決定 - 如果我的授權類說「拒絕訪問」,我們不會然後諮詢擴展。