Shiro - 如何有效地选择用户有权使用的所有资源?

时间:2013-10-22 07:52:19

标签: grails 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)]

虽然这种方法有效但看起来非常低效。实现这个更好的方法是什么?也许在用户和文件之间建立关系?

1 个答案:

答案 0 :(得分:3)

您可以如您所说,在UserService(1 - > M)之间创建关系,以便更轻松地为{{1} Service对象运行查询}}。我对此的想法是,听起来它适合您的域模型,毕竟,UserUser之间的ServiceService之间存在真正的关系。事实属于User。权限仍然有助于控制谁有权访问Service,而User仍然是Service的所有者

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

它可能不会使它更有效但它是一个更清洁的解决方案