2012-01-19 27 views
6

我發現真正靈活的安全框架Apache Shiro。我使用Shiro成功實施了認證和授權。Apache Shiro中的實例級別訪問控制

該框架吸引人的功能之一是基於實例的安全性。我只是複製Shiro網站的例子。

以下權限存儲在數據庫中。

printer:query:lp7200 
printer:print:epsoncolor 

如果在一個打印機實例,當前已驗證的用戶有權限或沒有下面的代碼檢查。

if (SecurityUtils.getSubject().isPermitted("printer:query:lp7200") { 
// Return the current jobs on printer lp7200 
} 

我的問題是「這是如何將權限存儲在數據庫中?」 有沒有更好的方法來存儲基於實例的權限?

請讓我知道。

謝謝

回答

9

如何存儲這些信息完全取決於您。您的Realm實施負責查詢您正在使用的任何數據源,並以您喜歡的格式提取許可數據。

有些人將它們直接存儲爲字符串(如示例中所示),其他人將它們存儲在專用表(例如,如果使用RDBMS)(例如,permission_type,target,action列)中。您可以將權限實體關聯到角色,或者直接關聯到用戶或分配給用戶的組等,但對於您的應用程序來說是有意義的。

您的存儲選項完全取決於您。您將實現數據,但是您希望確保Realm.isPermitted(...)操作按預期運行。

而是直接實現Realm.isPermitted(...)方法,很多人覺得它更方便地繼承抽象AuthorizingRealm類並重寫doGetAuthorizationInfo方法,並返回支持許可表示AuthorizationInfo實例。

在該方法中,您可以查詢數據存儲,將返回的數據轉換爲AuthorizationInfo實例,然後完成(不要忘記啓用授權緩存 - 您會看到很大的性能優勢)。

重寫RealmisPermitted方法只需要,如果你想在查詢非常具體的控制等