我已经实现了一项服务,用户可以上传文件(此处称为服务)来分析它们。每个注册用户只能访问他上传的文件。
因此,在上传文件后,我授予用户该文件的通配符权限:
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)]
虽然这种方法有效但看起来非常低效。实现这个更好的方法是什么?也许在用户和文件之间建立关系?
答案 0 :(得分:3)
您可以如您所说,在User
和Service
(1 - > M)之间创建关系,以便更轻松地为{{1} Service
对象运行查询}}。我对此的想法是,听起来它适合您的域模型,毕竟,User
和User
之间的Service
和Service
之间存在真正的关系。事实属于User
。权限仍然有助于控制谁有权访问Service
,而User
仍然是Service
的所有者
[services: Service.findAllByUser(User.findByUsername(SecurityUtils.subject.principal))]
它可能不会使它更有效但它是一个更清洁的解决方案