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)]
雖然這個工作,它似乎太沒效率了。什麼是更好的實現方式?也許在用戶和文件之間創建一個關係?
此外,我不會使用shiro權限來檢查用戶是否被允許訪問該文件。如果他真的只被允許查看他自己的文件,那麼檢查所有權更容易... – rdmueller
@Ralf提供在將來沒有機會,甚至一些文件可能會公開 - 那麼是的,我會同意 –
你把文件標記爲公共?如果它帶有一個標誌,則可以輕鬆檢查「if isOwner ||」之類的內容isPublic'。有了您的理念,您將不得不爲公共文件分配正確的權限 - 即使是未來將註冊的用戶也是如此。 – rdmueller