2012-08-04 75 views
2

假設這個類(在常規):定義訪問級別的基於對象的字段值

class Class_A { 
    String type 
    ... 
} 

我想定義的訪問級別基於類型的值的實例。例如,如果類型值爲「T1」,並且其他用戶具有對其的讀取訪問權限,則某些用戶對Class_A具有讀取訪問權限,如果類型值爲「T2」。 請不要提供基於繼承的解決方案。我可以使用spring-security或apache shiro嗎?

回答

2

據我所知,沒有任何插件,它解決了這個問題,開箱即用的,但我已經實現與四郎這的確限制訪問對象的項目。

您的問題將分成兩個獨立的問題:

一)限制直接訪問對象 - 無權限的用戶不應該能夠訪問該節目網頁,這些對象

B)篩選器列表和搜索 - 用戶沒有正確的權限不應該看到在概述列表中的那些對象和搜索結果


我解決了):

爲每個能夠顯示要保護的對象的控制器創建一個Filter-Class(http://grails.org/doc/latest/guide/single.html#filters)並添加一個before -filter。在此過濾器中,您可以預取對象並檢查權限。如果它們不匹配,則可以重定向到拒絕訪問頁面。 (當你在控制器中第二次請求時,Hibernate似乎足夠聰明,可以從緩存中取得對象)

btw:這樣,你也可以實現其他隱式權限和角色(例如,只顯示一個對象用戶已經創建了自己它)


我的解決方案b):

在多數項目中,您必須修改列表視圖,並添加一個搜索。那麼爲什麼不簡單地添加一個搜索條件作爲過濾器的對象?如果您使用條件構建器,則添加附加條件非常簡單...但您必須確保分頁和排序按照正確的方式完成。

希望有所幫助。

1

Apache Shiro可以做到這一點,但它確實需要一點工作。

在我的解決方案我實現了一個經典的RBAC模型,並提供了自定義的AuthorizingRealm重寫這些方法

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) 
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) 

是獲取返回應該包含一個用戶應具有的角色和權限的AuthorizationInfo。

SimpleAuthorizationInfo authInfo= new SimpleAuthorizationInfo(acl.getRoles()); 
authInfo.addStringPermissions(acl.getPermissions()); 
return authInfo; 

在四郎權限定義爲:

domain:action:instance 

所以,在你的榜樣此字符串權限允許對Class_A

的T1實例
Class_A:edit:T1 

您還可以允許「所有編輯「行動或實例。

Class_A:*:T1 // allow all actions 
     or 
Class_A:edit:* // allow edit of all instances 

希望這會有所幫助。

相關問題