你在哪裏存儲的政策基本上是無能爲力的。這取決於您使用的引擎,例如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
}
}
}
}
謝謝你的詳細解答。我看到我自己的解決方案與XACML類似,這是完美的,因爲遷移不會那麼困難。但對我來說,將策略存儲在數據庫中(以便在運行時更改它們)非常重要。你知道哪些免費或開源解決方案支持這個嗎? – benkuly
我會假設所有的開源引擎都可以從數據庫中讀取XACML策略。試試AT&T的XACML,WSO2或AuthZForce,你提到的那個。它是OSS社區中最新和最完整的之一 –
您是否知道我應該如何或應該開始一個新問題。問題是,他們都沒有或稀疏的文件,所以我不知道哪一個是最適合數據庫策略。 – benkuly