2017-06-15 84 views
1

我將使用OAuth2和XACML(使用AuthZForce)來保護我的Spring Cloud應用程序。從自定義ABAC切換到XACML

我已經實現了一個簡單的ABAC解決方案,它可以處理下面的用例,但我想切換到XACML。可能嗎?

舊域

我有(數據庫):

  • 政策(例如subject.id == resource.ownerId),即由enfocement點檢查,以決定
  • 權限(例如DELETE_USER),有一些明確的政策
  • 的角色(如員工),持有一些權限
  • 壯舉(例如PREMIUM),持有一些默認值,由公司使用的角色和權限
  • 公司,有一些功能
  • 用戶,分配給公司

用例

現在來自公司的用戶可以創建新角色ROLE_X。他可以爲這個角色分配一些權限。

UPDATE

因爲這個問題原本包含兩個不同的問題,我決定外包的第二個問題(AuthZForce for Spring Cloud

回答

1

你在哪裏存儲的政策基本上是無能爲力的。這取決於您使用的引擎,例如AuthZForce(我已經把作者釘住了,所以他可以插入),SunXACML,WSO2或Axiomatics。

聲明:我爲Axiomatics工作。我們確實使用數據庫來存儲XACML策略,但不會更改授權要求或建模。

我對你原來的帖子有一些評論。

  • subject.id==resource.ownerId是我們通常稱爲XACML中的一個條件。您將兩個屬性進行比較以實現關係。
  • 您提到了權限,例如DELETE_USER。在XACML中,你通常將它們分成原子屬性,例如一方面是動作,另一方面是對象或資源(USER)。雖然RBAC是基於角色和許可的,但ABAC是基於屬性的。理想的情況是這些屬性表示一個方面(作爲一個用戶,試圖刪除 ...)
  • ROLE仍然存在ABAC。這將是您的政策的基礎。
  • 功能和公司是您使用的屬性。

考慮到這一點,你可以寫的政策,如以下(使用ALFA符號):

namespace axiomatics{ 

    namespace user{ 
     attribute role{ 
      category = subjectCat 
      id = "axiomatics.user.role" 
      type = string 
     } 
     attribute company{ 
      category = subjectCat 
      id = "axiomatics.user.company" 
      type = string 
     } 
     attribute userId{ 
      category = subjectCat 
      id = "axiomatics.user.userId" 
      type = string 
     } 
    } 

    namespace action{ 
     attribute actionId{ 
      category = actionCat 
      id = "axiomatics.action.actionId" 
      type = string 
     }   
    } 

    namespace resource{ 
     attribute company{ 
      category = resourceCat 
      id = "axiomatics.resource.company" 
      type = string 
     } 
     attribute owner{ 
      category = resourceCat 
      id = "axiomatics.resource.owner" 
      type = string 
     } 
    } 

    policyset springapp{ 
     apply firstApplicable 
     policy employees{ 
      target clause user.role == "employee" 
      apply firstApplicable 
      /** 
      * Employees can create roles in their own company 
      */ 
      rule createRole{ 
       target clause action.actionId=="create" 
       condition user.company==resource.company 
       permit 
      } 
      /** 
       * Employees can delete roles they own 
       */ 
      rule allowDelete{ 
       target clause action.actionId == "delete" 
       condition user.userId == resource.owner 
       permit 
      } 
     } 
    } 
} 
+0

謝謝你的詳細解答。我看到我自己的解決方案與XACML類似,這是完美的,因爲遷移不會那麼困難。但對我來說,將策略存儲在數據庫中(以便在運行時更改它們)非常重要。你知道哪些免費或開源解決方案支持這個嗎? – benkuly

+0

我會假設所有的開源引擎都可以從數據庫中讀取XACML策略。試試AT&T的XACML,WSO2或AuthZForce,你提到的那個。它是OSS社區中最新和最完整的之一 –

+0

您是否知道我應該如何或應該開始一個新問題。問題是,他們都沒有或稀疏的文件,所以我不知道哪一個是最適合數據庫策略。 – benkuly