3

我已经实现了一个服务,用户可以上传文件(这里称为服务)来分析它们。每个注册用户只能访问他上传的文件。

因此,在上传文件后,我授予用户该文件的通配符权限:

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)]

虽然这有效,但它似乎非常低效。有什么更好的方法来实现这一点?也许在用户和文件之间建立关系?

4

1 回答 1

3

User您可以如您所说在and (1 -> M)之间创建关系,Service从而更轻松地Service为 that 运行对象查询User。我的想法是,它听起来像是适合您的域模型,毕竟,听起来 theUser和 the之间存在真正的关系,Service因为Service事实上确实属于User. Service权限仍然有助于控制谁可以User访问Service

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

它可能不会提高效率,但它是一种更清洁的解决方案

于 2013-10-22T10:10:43.727 回答