关于使用Shiro限制结果集

时间:2016-09-14 12:07:59

标签: java authorization shiro

我们有一个应用程序,允许用户查看文档列表。

根据用户的角色和文档的属性,我们希望过滤掉列表中的一些文档。例如,我们希望允许用户查看仅包含他创建的文档的列表,以及其余的灰色外线。

此时应用程序执行SQL SELECT命令,该命令返回用户可以看到和不能看到的条目列表。之后我们希望根据用户的权限和角色来限制此结果集。 我们的问题如下:

  • 可以通过Shiro完成吗?
  • 使用Shiro时,这种限制的正确方法是什么?例如我们应该使用SELECT语句从一开始就限制列表吗?

1 个答案:

答案 0 :(得分:0)

您有几个选择: 首先,因为您似乎想要向用户显示完整的文档列表,您仍然需要查询所有文档。 (虽然我在此提醒你,因为泄漏了用户无法访问的信息。例如,用户' jcoder看到一个标题为“超级密码密码”的文件,他知道你有这个文件。这对你的用例可能有问题,也可能没有关系)

如果您的用例仅限于#34;只有作者才能编辑自己的文档"然后你可以只是简单的用户名比较(我猜你现在在做)

大多数用例并非如此简单,并且需要作者以及管理员,技术编写者等访问资源。因此,您可以为资源分配一组权限。我们可以将其称为publications:docs:<document_id>:<action>,或仅docs:<document_id>:<action>。其中document_id是一些唯一的文档标识符,action对资源执行的操作(在典型的CRUD应用程序中,它们将创建,读取,更新,删除)。 可以将此权限授予任何用户,并且可以向作者授予publications:docs:<document_id>:*。如果有人更改位置或者文档需要被标记为只读,除了管理员之外的所有用户也是如此,这也允许撤销权限。

代码片段看起来像:

if(SecurityUtils.getSubject().isPermitted("publications:docs:":"+ documentId + ":read" ) {
  // do something
}

或者你可以检查他们all at once

您的应用需要跟踪向用户添加权限。

看看:http://shiro.apache.org/permissions.html

还有一个类似的问题:Java – efficient, database-aware instance-level authorization?