[英]Can I use Apache Shiro for a hierarchical user model?
我正在設計一個應用程序,用戶在多個級別的層次結構中進行組織。 可以使用角色將用戶分配到此層次結構的任何級別。
組織層次結構示例http://i59.tinypic.com/14ya3vd.png
所以,我想知道是否有一種方法可以使Apache Shiro適應這種層次結構,我可以在其中為角色IN組織定義權限,這意味着,不僅僅具有可以對任何用戶執行任何操作的“管理員”角色, “組織A”的“管理員”,可以對屬於“組織A”或其任何子組織的任何用戶執行任何操作。
我認為我正在尋找的是一種路徑機制,類似於Apache Shiro通配符系統,但是具有組織路徑,例如:
users:*:organizationA/*
這意味着對用戶對組織A及其所有子組織內的所有用戶的任何操作的許可。
最后,我需要的是一個分層用戶模型中的資源權限系統。 有沒有辦法用Apache Shiro模擬這樣的東西? 我應該使用任何其他框架,還是需要添加一些代碼才能實現這一目標?
好吧,我最后重新發明了輪子。 我放棄了Apache Shiro,因為如果我必須實現自己的權限解析器,我找不到它的用處,所以我自己創建了一個。 在我的權限系統中,我使用組織層次結構,順便說一下,它最終成為一個圖形。 因此,我的權限在其定義中需要有點復雜。 這就是我編寫它們的方式:
Role:ResourceType:Action:Scope
因此權限定義為:“此角色通過此類資源可以執行此操作”。 並且要將該定義與層次結構相關聯,因此,要知道如何使用該角色來解決該問題,我就有了范圍。 范圍告訴我們何時應用權限,並且它與層次結構直接相關。
我假設我可以使用定位器在層次結構中放置任何資源。 在我的例子中,定位器是用戶或組織。 我知道這很復雜(或許它不是,我只是解釋得很差),所以讓我們跳到一個例子。
我有這個層次結構:
現在讓我們假設我們有一個資源, Excalibur ,類型為mightyWeapon ,以及一個動作進位 。 現在,我們想要講述強大的武器:如果他們屬於同一個組織或任何其他子組織,他們可以由國王攜帶。 所以我們允許這樣說,是這樣的:
king:mightyWeapon:carry:sameBelow
在這種情況下的范圍是sameBelow告訴我們這適用於國王所屬的同一組織或該組織的任何子組織。
現在,為了檢查,我必須告訴資源在層次結構中的位置。 在這種情況下,我們假設Excalibur屬於Camelot。
現在,讓我們檢查,如果用戶亞瑟可以攜帶 神劍 。 因此,解決許可所涉及的變量將是:
現在,要解決此權限檢查,我們將獲得亞瑟的所有會員記錄。 也就是說,他所屬的每個組織和所應用的角色。 我們有兩個:
對於每一個,我們嘗試解決權限。 對於第一個,我們知道國王可以攜帶屬於同一組織或其下任何其他組織的強大武器。 神劍屬於卡米洛特 ,也是如此亞瑟 國王 ,這樣他就可以隨身攜帶。 我們將在這里停止檢查,並且許可的解決方案將是可能的。
現在,讓我們檢查一下galahad是否可以攜帶Excalibur。 他有這些會員資格:
對於第一個,我們沒有任何許可告訴我們騎士可以攜帶強大的武器,所以我們繼續解決。
對於第二個,我們知道國王可以攜帶強大的武器,但是神劍並不像加拉哈德作為國王那樣處於同一水平,或者與任何子組織處於同一水平,因為RoundTable本身就是卡米洛特的一個子組織。 因此,此權限檢查結果為否定。
就是這樣。 我希望這個例子能夠澄清一下。 當然,我有一堆范圍可以使其更加完整,但這是我提出的最佳解決方案。 歡迎提出任何改進建議。
您可以創建WildcardPermission類的子類,並實現自己的implies方法來編寫自己的權限字符串實現。
然后覆蓋WildcardPermissionResolver以返回您的權限實現而不是標准實現。
然后,您可以將其配置為在shiro.ini中全局使用:
globalPermissionResolver = com.foo.bar.MyPermissionResolver
請參閱此處的文檔: https : //shiro.apache.org/authorization.html#Authorization-Configuringaglobal%7B%7BPermissionResolver%7D%7D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.