2013-10-22 16 views
3

我已經實現了一個服務,用戶可以上傳文件(這裏稱爲服務)來分析它們。每個註冊用戶只能訪問他上傳的文件。Shiro - 如何有效地選擇用戶有權限的所有資源?

所以,上傳一個文件後,我授予用戶通配符許可該文件:

def currentUser = SecurityUtils.subject 

if (currentUser.isAuthenticated()) { 
    def user = User.findByUsername(currentUser.principal) 
    user.addToPermissions("service:*:$serviceId") 
    user.save() 
} 

當訪問一個文件,我檢查,如果當前登錄的用戶打開該文件的權限:

SecurityUtils.subject.checkPermission("service:*:$id") 

這似乎工作一切正常,但現在我想給登錄用戶一種方式列出他上傳的所有文件。對於這一點,我得到了用戶,把他的所有權限,提取ID,然後搜索文件:

def user = User.findByUsername(SecurityUtils.subject.principal) 
    def serviceIds = user.permissions.collect { it.split(':').last().toLong() } 

    [services: Service.findAllByIdInList(serviceIds)] 

雖然這個工作,它似乎太沒效率了。什麼是更好的實現方式?也許在用戶和文件之間創建一個關係?

回答

3

,你可以像你說的創建UserService之間的關係(1 - > M)使其更易於運行的Service對象爲User查詢。我的想法是,它聽起來像適合您的域模型,畢竟,它似乎在UserService之間存在真正的關係,因爲Service實際上屬於User。權限仍然是控制誰可以訪問Service而一個User有益的遺體Service

[services: Service.findAllByUser(User.findByUsername(SecurityUtils.subject.principal))] 

主人也許不能使它更有效,但它是一種清潔的解決方案

+2

此外,我不會使用shiro權限來檢查用戶是否被允許訪問該文件。如果他真的只被允許查看他自己的文件,那麼檢查所有權更容易... – rdmueller

+0

@Ralf提供在將來沒有機會,甚至一些文件可能會公開 - 那麼是的,我會同意 –

+0

你把文件標記爲公共?如果它帶有一個標誌,則可以輕鬆檢查「if isOwner ||」之類的內容isPublic'。有了您的理念,您將不得不爲公共文件分配正確的權限 - 即使是未來將註冊的用戶也是如此。 – rdmueller

相關問題